在 PHP 中查询文件系统是否会降低性能


Is there a performance hit for querying the file system in PHP?

很多

年前我就被告知,在PHP中使用"include"语句不会在性能上"花费"任何东西。但是当你查询文件系统时,例如运行"filemtime"或"readdir"时呢?如果我对每个页面请求执行这些操作,这是有问题的吗?谢谢!

包含语句在性能上"不花费任何费用"的原因是因为这些包含文件通常也被缓存。PHP脚本的半编译版本可以存储在APC缓存中(参见:http://php.net/manual/en/book.apc.php)

除了该缓存之外,操作系统还将缓存文件访问,因此对filemtime的后续调用不需要每次都进行实际的磁盘访问。即使操作系统从硬盘驱动器请求信息,该驱动器也可能缓存了最新的请求。因此,存在多个级别的缓存,所有这些都是为了使磁盘访问尽可能快。

因此,由于这些原因,多次调用filemtime也应该不是一个大问题,但是如果您需要读取许多不同的文件,缓存可能无法以最佳方式工作,并且您将拥有大量实际的磁盘I/O。您可以通过升级硬件来解决此问题。SSD 的 RAID 可能比单个旋转磁盘读取得更快。

如果性能仍然是一个问题,您可以自己将文件的文件时间存储在缓存中,例如APC或memcache,甚至是包含相关文件信息数组的PHP包含文件。当然,您需要确保每次写入文件时都更新此缓存。并确保分析您所做的每个优化。如果您没有 APC,则包含文件可能没有任何好处。此外,即使数据本身在内存中,对 memcache 的请求也会有一些开销。因此,这些解决方案并不能保证改善情况。

但与往常一样,如果不需要,请不要开始实施此类优化。过早优化... :)