3

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

就我而言,所有网站信息都存储在数据库(cms)中,因此总是有一个查询来拉取图像路径等。问题是出于缓存目的,我需要让我的 HTML 输出像这样<img src="/img/photo.jpg?v20190613" />。从我在 php.net 网站上读到的内容,这个函数被缓存了。那么它会使用更少的资源向存储上次更新时间戳的数据库表添加一个字段还是每次都使用此函数?这两种方式有什么优势吗?我正在寻找能够提供最佳性能的任何东西。

4

3 回答 3

8

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

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

您今天可能没有这种架构。您可以将 PHP 代码部署到静态文件所在的同一主机以及数据库。但是,随着您的应用程序超出单个主机,或者需要在部署期间不间断运行,您最终需要横向扩展至多个主机。最好尽早计划好,如果可以避免的话,不要实现阻止您向外扩展的代码。

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

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

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

于 2019-06-18T23:19:25.087 回答
0

我停止使用上传的文件名作为服务器上的文件名。当我这样做时,关键文件已被覆盖(例如 PHP、CSS 等)。所以我在保存文件时向文件名添加了一个随机字符串。

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

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

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

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

于 2019-06-26T08:01:25.013 回答
0

使用 MySQL 数据库通常更好

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

并且查看您的特定情况,在数据库中保存时间戳会更快,因为时间戳将与图像路径一起存储,因此您可能一次获得时间戳和文件路径,另一方面使用 filemtime 会很昂贵,因为php 会请求文件系统,文件系统会搜索文件以提供时间戳。

于 2019-06-25T12:42:18.353 回答