Tüm alt klasörleri bir klasörde listeleyen bir işlev yapmak zorundayım. Dosya filtresi yok, ancak işlev listelemek için scandir() kullanıyor. Bu uygulamayı çok yavaşlatır. Scandir(), hatta bir yerel php işlevi bile bir alternatif var mı? Şimdiden teşekkürler!PHP: scandir() çok yavaş
cevap
:
function readDirectory($Directory,$Recursive = true)
{
if(is_dir($Directory) === false)
{
return false;
}
try
{
$Resource = opendir($Directory);
$Found = array();
while(false !== ($Item = readdir($Resource)))
{
if($Item == "." || $Item == "..")
{
continue;
}
if($Recursive === true && is_dir($Item))
{
$Found[] = readDirectory($Directory . $Item);
}else
{
$Found[] = $Directory . $Item;
}
}
}catch(Exception $e)
{
return false;
}
return $Found;
}
bazı tweeking gerektirebilir ama bu scandir ne esasen, ve i olarak bir güncelleme yazınız değilse o kadar hızlı olmalıdır Daha hızlı bir çözüm yapıp yapamayacağımı görmek isterim.
Diğer bir konu ise, çok büyük bir dizini okuyorsanız, dahili bellek içinde bir diziyi doldurmanız ve belleğinizin olduğu yerde olabilir.
Bir seferde 50 dosya gönderebilmeniz için, ofsetleri okuyan bir işlev oluşturmayı deneyebilirsiniz! Bir seferde dosyaların
okuma parçaları şöyle olurdu, kullanmak kadar basit olacaktır:
$offset = 0;
while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset)))
{
//Use $batch here which contains 50 or less files!
//Increment the offset:
$offset += 50;
}
her şey mükemmel görünüyor, ama nasıl devre dışı bırakılır. ve .. klasörler. Ayrıca listelemek istemediğim boş bir dizinim var. Sanırım yakalamada (İstisna), ama nasıl biçimlendirilecek? –
Ive, '.' veya' ..' içermediğinden güncelleştirildi, ancak boş dizin – RobertPitt
EVET ile ilgili ne demek istediğinizden emin değilim !! Benim için mükemmel çalışıyor. Sağolun beyler! –
kendi yazmayın. Kural (zamanın aka değil% 100) düz C uygulanan beri, her şey PHP inşa gibi
http://php.net/manual/en/class.recursivedirectoryiterator.php
gidiyor: PHP bir özyinelemeli Dizin Yineleyici bunun için özel olarak inşa etti yavaş ol.
Taradığınız dizinde kaç dosya/dizin var? Bu, her direkte bir "stat()" yapmıyorsanız veya oradaki binlerce dosya yoksa, yavaş olmamalıdır. –
http://www.php.net/manual/en/function.scandir.php#96326 – Detect
http://www.php.net/manual/en/function.scandir.php#73062 – Detect