【问题标题】:Symfony 2 asset, check if file exists performanceSymfony 2资产,检查文件是否存在性能
【发布时间】:2015-06-25 21:34:17
【问题描述】:

在symfony 2上,使用Twig你可以使用asset()函数来链接图像
{{ asset('path_to_the_image') }},现在如果文件不存在那么文件的src保持不变,

考虑到这一点,我很想在我的TwigExtensions 上创建另一个 Twig 函数,以检查文件是否存在,为了执行以下操作,如果文件存在,那么我将使用给定的 url,如果存在不存在,那么我会将函数的结果更改为我将用作 not_image 图像的默认图像。 此功能的动机是始终向用户显示图像。

现在,我的问题。

我无法弄清楚这种方法的性能问题,因为我将检查文件两次,第一次检查是否存在,另一次是请求文件的请求。通常要做的事情是放置资产地址,如果文件不存在,请使用 javascript 将其替换为一些默认文件。

我将使用 php 的 file_exists 函数,并且在我读过的手册中它非常便宜,并且如果文件确实存在,结果会被缓存以避免性能问题。

提前谢谢...

【问题讨论】:

  • 只需使用 file_get_contents。如果最终证明是一个问题,缓存它,使用现有文件的注册表/索引。但我的猜测是到了性能问题的时候,简单地添加一个更快的服务器是最快和最便宜的解决方案

标签: php symfony


【解决方案1】:

file_exists 触发对您的文件系统(或者,甚至只是 FS 元数据)的读取访问。这确实非常便宜。请记住,在运行 Symfony 应用程序时,您通常会单独访问数百个 PHP 文件。

file_exists 的结果确实被缓存了,但只是在脚本执行期间。因此,如果您在一个脚本执行中多次调用file_exists(并且在其间不要调用clearstatcache),结果将被缓存。如果稍后再次调用该脚本,PHP 将再次查找该文件。


然而,如果你真的担心性能,你不应该“即时”检查文件是否存在,而是创建一个 Symfony 命令来检查所有链接的资产在运行期间是否有效构建或部署。

此命令基本上会呈现所有页面,并且您的自定义资产函数将抛出异常,而不是返回虚拟图像。这样,您只需在部署期间检查一次所有资产是否有效。

【讨论】:

  • 谢谢,我可以用命令完成,但我要检查的资产是用户上传的图像。我会将答案标记为正确。
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多