PHP filemtime vs MySQL最近更新的时间戳,用于CMS中的图像缓存

时间:2019-06-13 21:34:19

标签: php mysql filemtime updatedate

我正在尝试确定将图像的最后修改日期存储在MySQL数据库中还是使用PHP函数filemtime更好。

在我的情况下,所有网站信息都存储在数据库(cms)中,因此总会有一个查询来提取图像路径,等等。问题是出于缓存目的,我需要将HTML输出如下<img src="/img/photo.jpg?v20190613" />。根据我在php.net网站上阅读的内容,此功能已被缓存。那么,它会使用较少的资源向存储上次更新时间戳的数据库表中添加字段还是每次使用此功能吗?两种方式都有优势吗?我正在寻找可以提供最佳性能的东西。

3 个答案:

答案 0 :(得分:8)

出于某种特定的原因,我不会使用filemtime():它仅用于检查运行PHP代码的同一主机上的本地文件。

在现代应用程序部署中,通常将PHP代码部署到与提供静态资源的主机不同的主机上。实际上,通常将PHP代码部署到负载均衡器后面的多个应用服务器上,因此您可以进行滚动部署而不会造成任何停机。

您今天可能没有这种体系结构。您可以将PHP代码部署到静态文件所在的同一主机上,也可以将数据库部署到同一主机上。但是,由于您的应用程序超出了单个主机,或者需要在部署期间进行不间断的操作,因此最终需要扩展到多个主机。最好尽早进行计划,并且不要实施阻止您横向扩展的代码。

所有PHP应用程序服务器都不能直接访问保存了静态文件的文件系统。如果他们这样做,则必须执行以下操作之一:

  • 在每个PHP应用程序服务器上存储静态文件的重复副本,从而使用更多的存储空间。然后担心保持它们同步,使用一些后端脚本来连续检查所有主机是否具有相同的文件集,等等。
  • 为通过NFS或类似协议远程安装到所有PHP应用程序主机的静态文件创建文件系统。然后filemtime()检查会变慢一些,因为它们要通过NFS。而且,您还必须担心NFS挂载会消失,安全性强制措施,在添加新的应用程序主机时配置NFS等等。

由于这些原因,我选择将时间戳记存储在数据库中,因为无论如何您已经在其中存储了文件元数据(路径名)。

答案 1 :(得分:0)

使用MySQL数据库通常更好

MySQL可以并且可以执行BST索引和查询缓存,这是文件系统并不总是可用的一种奢侈。

考虑到您的特殊情况,将时间戳保存在数据库中会更快得多,因为时间戳将与图像路径一起存储,因此您可能会一次性获得时间戳和文件路径,而使用filemtime会成本很高,因为php会请求文件系统,而文件系统会搜索文件以提供时间戳。

答案 2 :(得分:0)

我停止使用上载的文件名作为服务器上的文件名。当我这样做时,关键文件已被覆盖(例如PHP,CSS等)。因此在保存文件时,我在文件名中添加了random string

有了这个,每个文件名都是唯一的,所以:

  • 文件不会被覆盖。
  • 文件名是唯一的,因此不会被缓存。

因此,在图像的URL中添加字符串不会遇到麻烦。

顺便说一句:对于CSS和JS文件,我还将在文件名中添加随机字符串,而不是添加“ GET参数”。