当前位置:  开发笔记 > 编程语言 > 正文

PHP中的file_exist()是一个非常昂贵的操作吗?

如何解决《PHP中的file_exist()是一个非常昂贵的操作吗?》经验,为你挑选了3个好方法。

我正在为我正在设计的论坛引擎添加头像,我正在讨论是否要做一些简单的事情(论坛图片命名为.png)并使用PHP在显示之前检查文件是否存在,或者做一些事情有点复杂(但不多)并使用数据库字段来包含要显示的图像的名称.

我更愿意亲自使用file_exists()方法,因为如果当前的那个(默认)还没有存在,那么我可以轻松地回归到"默认"虚拟形象,并且它很容易实现代码.但是,我担心性能,因为每个用户在论坛阅读页面上每页面显示一次就会运行一次.所以我想知道,PHP中的file_exists()函数会导致在高流量条件下导致显着性能下降的任何重大减速吗?

如果不是,那很好.如果是这样,您对跟踪用户上传图像的替代方案有何看法?谢谢!

PS:我可以看到的代码差异是文件检查版本允许文件进行通话,而数据库表单信任数据库是准确的并且不打算检查.(它只是一个传递给浏览器的URL.)



1> MrZebra..:

与其他海报所说的一样,file_exists()的结果由PHP自动缓存以提高性能.

但是,如果您已经从数据库中读取用户信息,那么您也可以将信息存储在那里.如果用户只允许一个头像,你可以只在"有头像"(1/0)的列中存储一个位,然后将文件名与用户ID相同,并使用类似的东西SELECT CONCAT(IF(has_avatar, id, 'default'), '.png') AS avatar FROM users

您还可以考虑将实际图像作为BLOB存储在数据库中.将它放在自己的表中,而不是将其作为列附加到用户表.这样做的好处是它使您的论坛非常容易备份 - 您只需导出数据库.


但BLOB对性能不利.你得到运行PHP,MySQL的开销,你必须编写对HTTP缓存验证的支持,否则浏览器将不必要地继续重新下载头像.
重要的是要注意PHP只会缓存存在的文件的结果,它不会缓存不存在的文件的结果.请参阅:http://www.php.net/manual/en/function.clearstatcache.php

2> Greg Hewgill..:

由于您的Web服务器在显示您的网页的过程中已经执行了大量(相当于)file_exists()操作,因此脚本运行的操作可能不会产生可测量的影响.Web服务器可能至少会:

一个用于Web根目录的每个子目录(用于检查存在性和符号链接)

一个用于检查Web根目录的每个子目录的.htaccess文件

一个是因为你的脚本存在

这并没有考虑PHP可能会做的更多.



3> Kent Fredric..:

在实际的性能测试中,您将发现file_exists非常快.实际上,在php中,当同一个url是"stat"'d两次时,第二个调用就是从php的内部stat缓存中提取的.

这只是在php运行范围内.即使在运行之间,文件系统/ os也会倾向于将文件积极地放入文件系统缓存中,如果文件足够小,不仅文件存在测试直接从内存中出来,而且整个文件也是如此.

这里有一些支持我理论的真实数据:

我刚刚对linux命令行实用程序"find"和"xargs"进行了一些性能测试.在收益中,我在13000个文件上执行了一个文件存在测试,每次100次,在30秒内,这样每秒平均43,000次静态测试,所以肯定,如果你比较它的时候它的速度很慢它采用了8分9,但在真实的场景中,你将需要这样一个可怕的很多次看到一个显着的性能问题.

如果你有43000 用户同时访问你的页面,在一秒钟的时间内,我认为你将有更大的顾虑,而不是复制文件存在的状态或多或少的时间.平均情况下的内存.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有