我正在为我正在设计的论坛引擎添加头像,我正在讨论是否要做一些简单的事情(论坛图片命名为.png)并使用PHP在显示之前检查文件是否存在,或者做一些事情有点复杂(但不多)并使用数据库字段来包含要显示的图像的名称.
我更愿意亲自使用file_exists()方法,因为如果当前的那个(默认)还没有存在,那么我可以轻松地回归到"默认"虚拟形象,并且它很容易实现代码.但是,我担心性能,因为每个用户在论坛阅读页面上每页面显示一次就会运行一次.所以我想知道,PHP中的file_exists()函数会导致在高流量条件下导致显着性能下降的任何重大减速吗?
如果不是,那很好.如果是这样,您对跟踪用户上传图像的替代方案有何看法?谢谢!
PS:我可以看到的代码差异是文件检查版本允许文件进行通话,而数据库表单信任数据库是准确的并且不打算检查.(它只是一个传递给浏览器的URL.)
与其他海报所说的一样,file_exists()的结果由PHP自动缓存以提高性能.
但是,如果您已经从数据库中读取用户信息,那么您也可以将信息存储在那里.如果用户只允许一个头像,你可以只在"有头像"(1/0)的列中存储一个位,然后将文件名与用户ID相同,并使用类似的东西SELECT CONCAT(IF(has_avatar, id, 'default'), '.png') AS avatar FROM users
您还可以考虑将实际图像作为BLOB存储在数据库中.将它放在自己的表中,而不是将其作为列附加到用户表.这样做的好处是它使您的论坛非常容易备份 - 您只需导出数据库.
由于您的Web服务器在显示您的网页的过程中已经执行了大量(相当于)file_exists()操作,因此脚本运行的操作可能不会产生可测量的影响.Web服务器可能至少会:
一个用于Web根目录的每个子目录(用于检查存在性和符号链接)
一个用于检查Web根目录的每个子目录的.htaccess文件
一个是因为你的脚本存在
这并没有考虑PHP可能会做的更多.
在实际的性能测试中,您将发现file_exists非常快.实际上,在php中,当同一个url是"stat"'d两次时,第二个调用就是从php的内部stat缓存中提取的.
这只是在php运行范围内.即使在运行之间,文件系统/ os也会倾向于将文件积极地放入文件系统缓存中,如果文件足够小,不仅文件存在测试直接从内存中出来,而且整个文件也是如此.
这里有一些支持我理论的真实数据:
我刚刚对linux命令行实用程序"find"和"xargs"进行了一些性能测试.在收益中,我在13000个文件上执行了一个文件存在测试,每次100次,在30秒内,这样每秒平均43,000次静态测试,所以肯定,如果你比较它的时候它的速度很慢它采用了8分9,但在真实的场景中,你将需要这样一个可怕的很多次看到一个显着的性能问题.
如果你有43000 个用户同时访问你的页面,在一秒钟的时间内,我认为你将有更大的顾虑,而不是复制文件存在的状态或多或少的时间.平均情况下的内存.