2016-05-31 71 views
3

我正在開發一個應用程序,需要列出並從遠程FTP目錄下載一堆文件。爲此,我使用Symfony Finder組件,它構建在像RecursiveDirectoryIterator之類的SPL迭代器之上。使用PHP和Symfony Finder的FTP性能

我的問題是,性能絕對糟糕。例如,下面的代碼:

<?php 

$finder = new \Symfony\Component\Finder\Finder(); 
$finder->files()->in('ftp://user:[email protected]/')->name('*.tif'); 

foreach ($finder as $file) { 
    var_dump($file->getPathname()); 
} 

在一些FTP服務上,這給了我每10-30秒一個文件名!

我通過XDebug Profiler運行代碼,大部分時間都花在內部PHP函數中,如php::RecursiveDirectoryIterator->hasChildrenphp::FilterIterator->nextphp::SplFileInfo->isDir

我也運行我的腳本與Wireshark啓用,因爲我懷疑PHP可能下載整個文件只是爲了列出它們,但似乎並非如此。

有誰知道爲什麼表現如此糟糕?我該如何解決它?

回答

3

似乎PHP的SplFileInfo重新連接到FTP服務器每次你打電話給它的方法如isFile()isDir()。 Finder使用這些方法,這是造成糟糕表現的原因。爲每個文件打開多個FTP會話以獲取所有文件信息。

https://github.com/symfony/symfony/issues/18923

0

也許你能得到的文件的完整列表,並在您的腳本過濾。