2016-05-31 17 views
3

リモートFTPディレクトリから多数のファイルをリストしてダウンロードする必要があるアプリケーションを開発しています。このため、私はRecursiveDirectoryIteratorのようなSPLイテレータの上に構築されたSymfony Finderコンポーネントを使用しています。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秒ごとに約1つのファイル名を与えます。

私はXDebug Profilerでコードを実行しました。ほとんどの時間はphp::RecursiveDirectoryIterator->hasChildren,php::FilterIterator->nextphp::SplFileInfo->isDirなどの内部PHP関数で費やしています。

Wiresharkを有効にしてスクリプトを実行したのは、PHPがファイル全体をダウンロードしているだけかもしれないと思っていたからですが、そうではありません。

パフォーマンスが悪い理由を知っている人はいますか?それをどうやって修正することができますか?

答えて

3

PHPのSplFileInfoは、isFile()またはisDir()のようなメソッドを呼び出すたびに、FTPサーバーに再接続したようです。これらのメソッドはFinderで使用されており、それが原因でパフォーマンスが低下しています。すべてのファイル情報を取得するために、すべてのファイルに対して複数のFTPセッションが開かれます。

はたぶん、あなたは、ファイルの完全なリストを取得し、あなたのスクリプトでそれをフィルタリングすることができますhttps://github.com/symfony/symfony/issues/18923

0

を参照してください。

関連する問題