删除包含多个文件的目录中的文件时,php代码执行出现长时间延迟

删除包含多个文件的目录中的文件时,php代码执行出现长时间延迟,php,Php,我有一个“清理脚本”从文件系统中删除阵列中不存在的图像。 如果将它与我的目录中包含300个文件名和60.000个唯一文件的数组一起使用,它将在10秒内删除所有59.700个不需要的文件。 在一个更大的场景中,有860000个文件和600个文件名的数组,脚本速度会慢得多,但我不知道为什么 $start = microtime(true); $keepMe = ["file1.jpg", "file2.jpg", ......... ]; // files i want to keep, loade

我有一个“清理脚本”从文件系统中删除阵列中不存在的图像。 如果将它与我的目录中包含300个文件名和60.000个唯一文件的数组一起使用,它将在10秒内删除所有59.700个不需要的文件。 在一个更大的场景中,有860000个文件和600个文件名的数组,脚本速度会慢得多,但我不知道为什么

$start = microtime(true);
$keepMe = ["file1.jpg", "file2.jpg", ......... ]; // files i want to keep, loaded from mysql database
print count($keepMe ) . " files should be left after cleanup \n";
$files = glob("/my/directory/*");
print (microtime(true)-$start)."s - " . count($files) . " files in directory \n";

$removed = 0;
foreach ($files as $_f)
{
    if (in_array(basename($_f), $keepMe)) continue;

    unlink($_f);
    $removed++;
    if( $removed%500 == 0 ) print (microtime(true)-$start)."s - {$removed} files removed \n";
    if(microtime(true) - $start > 20) break;
}
 print (microtime(true)-$start)."s - {$removed} files removed in total";
我每隔500个删除的文件打印一次当前脚本执行时间,脚本在20秒后停止(仅用于性能比较)。
以下是我得到的输出:

清理后应保留860个文件
1.6677060127258s-目录中的385626个文件
1.679957151413s-删除500个文件
1.7079961299896s-删除1000个文件
... 我将跳过一些
2.7962679862976s-已删除10000个文件
2.8500139713287s-已删除10500个文件
23.64742398262s-总共删除10093个文件

最初,我在一个目录中创建了约580.000个图像,在多次运行和调试此脚本后,我的文件数达到了约385.000个,但速度没有加快。
在大多数情况下(比如90%),它删除了10k-11k图像,但有时只有300个。
在最后一次总计数输出之前有一个奇怪的20秒间隔(通常在10到15之间)。 在这一点上,我不知道那里发生了什么以及为什么。
我在~70个目录中使用了这个脚本,每个目录都有30k-60k图像,没有问题,但是有5个目录,每个目录有500k-600k图像,其中throubles开始。
相同的服务器,相同的php版本。
在这些麻烦之后,我执行了我的脚本,再次将它放在一个较小的目录中,结果很好,所以没有硬件限制。不幸的是,我不能在另一台服务器上测试它(实际上我正在清理它以移动到另一台服务器)


有什么想法吗?

处理文件需要时间。如果您有更多的文件,通常需要更长的时间。尝试的一件事是注释掉
unlink($\u f)
并查看这如何影响运行时。@NigelRen在不实际删除文件的情况下,它会在20秒内检查210k个文件,输出之间没有任何间隙。由于
unlink()
不应该是异步的,我想知道,在最终输出之间的10-15秒内会发生什么