文件复制需要额外的时间

File copy takes extra time

我正在将文件从 FTP 服务器复制到我的本地磁盘。

$allFilesList = array_filter(Storage::disk('ftp')->files('HSP'), function ($item) {
            return strpos($item, 'json');
});

foreach ($allFilesList as $file) {
            $newFile = Storage::disk('ftp')->get($file);
            Storage::disk('public')->put(basename($file),$newFile);
}

echo "finished"; 

程序有效。文件在 2-3 秒内复制(约 50 个文件)。但由于某种原因,需要 2-3 分钟才能完成 foreach 循环并显示回显。我不知道是什么原因造成的 "delay"。我如何检查发生了什么?

@马克奥弗顿 我运行微时间。由于某种原因,它跳到了最后:

This loop finished at 0.084124088287354
This loop finished at 0.11676001548767
This loop finished at 0.15384912490845
...
This loop finished at 1.342885017395
This loop finished at 1.3753559589386
This loop finished at 1.4076399803162
This loop finished at 181.64192605019
This loop finished at 181.67514610291
This loop finished at 181.70819401741

我将添加文件名以查看它停滞在哪个文件并检查该文件是否存在。奇怪的是,我在渲染之前以列表方式复制了最后一个文件并且文件没问题。

更新 1
经过额外的测试,我发现它总是停在第 40 号文件。 我将文件移动到另一个目录以排除硬盘驱动器问题。我尝试删除之前停滞的文件。然后我尝试了 39 个文件,效果很快。我尝试使用以前的 "problematic" 文件和不使用。在第 40 号文件,它停滞不前。我会尝试重命名文件,看看它是否是文件名长度的问题。之后我不知道可能是什么问题..

更新 2
在使用不同的文件、位置和文件名进行测试后,我在 FTP 连接上设置了超时,结果有了很大改善,所以我猜它与驱动程序或 FTP 服务器本身有关。不管怎样,我会每天使用一次这个功能来复制一个文件。偶尔会复制所有文件,所以我不会进一步优化。

现在的结果是:

Loop: 36 finished at: 1.3631699085236
Loop: 37 finished at: 1.3963389396667
Loop: 38 finished at: 1.4288220405579
Loop: 39 finished at: 1.461541891098
Loop: 40 finished at: 5.5195620059967
Loop: 41 finished at: 5.5600368976593
Loop: 42 finished at: 5.592465877533

使用 Microtime

它应该告诉您每个循环需要多长时间,这可能就是 运行 需要多长时间,但您可能会发现使用此方法可以加快代码的一部分获得 运行 时间。

$start = microtime(true);

$allFilesList = array_filter(Storage::disk('ftp')->files('HSP'), function ($item) {
    return strpos($item, 'json');
});

foreach ($allFilesList as $file) {

    $newFile = Storage::disk('ftp')->get($file);
    Storage::disk('public')->put(basename($file),$newFile);

    echo 'This loop finished at ' . (microtime(true) - $start) . '<br />';

}

echo "finished";