PHP 列出不存在的文件
PHP lists files that don't exist
我是 运行 Grav CMS on a Linode Ubuntu 16.04 server where PHP7 (php-fpm + nginx) returns cached results when listing directory contents. I first encountered the problem with FilesystemIterator
, but it isn't limited to that class - the same problem appears when I use scandir
。
基本上,每当我将新内容同步到服务器时,无论我使用 rsync 还是 FTP,PHP 都会 return 特定 [=] 的旧内容25=] 尝试调用 clearstatcache
,但它没有帮助——即使我在扫描目录之前从适当的 PHP 文件调用它。
touch
'ing 文件以更新它们的 mtime 也无济于事。但是,重新启动 php-fpm 服务确实有效。
有没有可能 PHP 以其他方式缓存目录的内容?会不会是文件系统在以某种方式欺骗 PHP?
有,但我不会在生产中使用它。
运行 先同步:$ sync
此命令将任何尚未写入磁盘的缓存数据写入磁盘。
可用页面缓存:echo 1 > /proc/sys/vm/drop_caches
空闲目录和索引节点:echo 2 > /proc/sys/vm/drop_caches
可用页面缓存、dentry 和 inode:echo 3 > /proc/sys/vm/drop_caches
话虽如此,我也会看一看 realpath_cache
。
事实证明,我遇到的问题不是由于 OS 或 PHP,而是由于 Grav CMS 本身——特别是它缓存页面对象的方式。如果更改的只是关联的媒体文件,它不会使缓存页面无效。关闭 Grav 的全局缓存设置有助于解决这个问题,但我也打开了 an issue on the Grav repo 以查看这是否是故意的行为。
我是 运行 Grav CMS on a Linode Ubuntu 16.04 server where PHP7 (php-fpm + nginx) returns cached results when listing directory contents. I first encountered the problem with FilesystemIterator
, but it isn't limited to that class - the same problem appears when I use scandir
。
基本上,每当我将新内容同步到服务器时,无论我使用 rsync 还是 FTP,PHP 都会 return 特定 [=] 的旧内容25=] 尝试调用 clearstatcache
,但它没有帮助——即使我在扫描目录之前从适当的 PHP 文件调用它。
touch
'ing 文件以更新它们的 mtime 也无济于事。但是,重新启动 php-fpm 服务确实有效。
有没有可能 PHP 以其他方式缓存目录的内容?会不会是文件系统在以某种方式欺骗 PHP?
有,但我不会在生产中使用它。
运行 先同步:$ sync
此命令将任何尚未写入磁盘的缓存数据写入磁盘。
可用页面缓存:echo 1 > /proc/sys/vm/drop_caches
空闲目录和索引节点:echo 2 > /proc/sys/vm/drop_caches
可用页面缓存、dentry 和 inode:echo 3 > /proc/sys/vm/drop_caches
话虽如此,我也会看一看 realpath_cache
。
事实证明,我遇到的问题不是由于 OS 或 PHP,而是由于 Grav CMS 本身——特别是它缓存页面对象的方式。如果更改的只是关联的媒体文件,它不会使缓存页面无效。关闭 Grav 的全局缓存设置有助于解决这个问题,但我也打开了 an issue on the Grav repo 以查看这是否是故意的行为。