Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP filemtime vs MySQL CMS中图像缓存的上次更新时间戳_Php_Mysql_Filemtime_Updatedate - Fatal编程技术网

PHP filemtime vs MySQL CMS中图像缓存的上次更新时间戳

PHP filemtime vs MySQL CMS中图像缓存的上次更新时间戳,php,mysql,filemtime,updatedate,Php,Mysql,Filemtime,Updatedate,我试图确定是否最好将图像的最后修改日期存储在MySQL数据库中,或者使用PHP函数 在我的例子中,所有网站信息都存储在一个数据库(cms)中,因此总是有一个查询来提取图像路径等。问题是出于缓存目的,我需要像这样的HTML输出。从我在php.net网站上看到的内容来看,这个函数是缓存的。那么,在数据库表中添加一个存储上次更新的时间戳的字段或每次使用此函数时,它会使用更少的资源吗?这两种方法都有好处吗?我正在寻找能够提供最佳性能的东西。我不会使用它,原因有一个:它只适用于检查运行PHP代码的同一主机

我试图确定是否最好将图像的最后修改日期存储在MySQL数据库中,或者使用PHP函数

在我的例子中,所有网站信息都存储在一个数据库(cms)中,因此总是有一个查询来提取图像路径等。问题是出于缓存目的,我需要像这样的HTML输出。从我在php.net网站上看到的内容来看,这个函数是缓存的。那么,在数据库表中添加一个存储上次更新的时间戳的字段或每次使用此函数时,它会使用更少的资源吗?这两种方法都有好处吗?我正在寻找能够提供最佳性能的东西。

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

在现代应用程序部署中,将PHP代码部署到与提供静态资源的主机不同的主机是很常见的。事实上,在负载平衡器后面将PHP代码部署到多个应用服务器是很典型的,因此您可以在不停机的情况下进行滚动部署

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

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

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

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

使用MySQL数据库更好

MySQL做并且可以做BST索引和查询缓存,这对于文件系统来说并不总是可用的


考虑到您的具体情况,在数据库中保存时间戳会快得多,因为时间戳将与映像路径一起存储,所以您可能一次就获得时间戳和文件路径,另一方面,使用filemtime会很昂贵,因为php会请求文件系统,文件系统将搜索该文件以获得它的时间戳。

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

这样,每个文件名都是唯一的,因此:

  • 文件不会被覆盖
  • 文件名是唯一的,因此不会缓存它们
因此,在图像的URL中添加字符串不会有问题


顺便说一下:对于CSS和JS文件,我也会向文件名中添加随机字符串,而不是添加“获取参数”。

如果您已经访问了数据库,那么在数据库中存储日期会更快,但是更快,我们所说的是微秒数。在我的情况下,使用cms的人更新了一些信息,并且涉及到一个图像,该图像可能保留相同的文件名,然后在前端他们仍然看到旧图像,我可以在数据库中添加一个字段来记录更新的时间戳,然后简单地将其附加到图像中,如我上面所述。如果您是从数据库访问文件信息,天气转晴得更快。只需考虑从文件系统读取上次修改的时间属性就意味着对磁盘进行更多的访问。我计划添加一个说明我如何解决这个问题的示例,我希望看到使用FielMeTimes和最后更新的数据库字段的开发人员面临的其他真实世界场景。这是一个非常好的点。意识到它可能不适用于大多数小规模情况。因此,对于小型应用程序,如果您已经在执行sql查询,那么将时间戳放在db中似乎比较合适,而不是运行filemtime()。这被证明是一项艰巨的任务,但最终是可行的。函数用于检查重复的文件名并附加数字示例Electric Guitar1.jpg等。v20190820120000有助于控制缓存