PHP fonksiyonu optimize

5 Cevap php

I have a function that detects all files started by a string and it returns an array filled with the correspondent files, but it is starting to get slow, because I have arround 20000 files in a particular directory. I need to optimize this function, but I just can't see how. This is the function:

function DetectPrefix ($filePath, $prefix)
{

    $dh  = opendir($filePath);
    while (false !== ($filename = readdir($dh))) 		
    {	
    	$posIni = strpos( $filename, $prefix);
    	if ($posIni===0):							
    	    $files[] = $filename;						
    	endif;
    }

    if (count($files)>0){								
    	return $files;
    } else {
    	return null;
    }

}

Ben daha ne yapabilirim?

Teşekkürler

5 Cevap

http://php.net/glob

$files = glob('/file/path/prefix*');

Wikipedia adlarına ilk çift harflerle yüklenenler kırılır, yani textfile.txt [(3) {gitmek istiyorum iken excelfile.xls /uploads/e/x gibi bir dizine gitmek istiyorum }].

Sadece bu dosyalar glob (ya da herhangi başka bir yaklaşım) ile sıralamak zorunda sayısını azaltmak, ama diğerleri de söylediğim bir dizin sayısında maksimum dosyaları önler gelmez.

Bunun yerine içlerinden yinelemeye, scandir() dizindeki dosyaları listelemek için kullanabilirsiniz tek-tek kullanılarak readdir(). scandir () dosyaların bir dizi döndürür.

Eğer gerçekten tek bir dizinde 20000 + dosyaları saklamak gerekiyor - Ancak, sizin dosya sistemi organizasyonu değiştirmek eğer daha iyi olurdu?

Diğer cevaplar söz gibi, ben) (glob bakmak istiyorum scandir (), ve / veya DirectoryIterator sınıf, tekerleği yeniden gerek yoktur.

Bu durumda ve sadece aynı dizinde dosya eklemeye devam ederseniz sınırına ulaştığınızda However watch out! check your operating system, but there may be a limit on the maximum number of files in a single directory. bazı kesintiler ve bazı sorunları olacaktır. Bu hata muhtemelen izinleri gibi görünür ya da yazma hatası değil, bariz bir "tek bir dizinde daha fazla dosya yazamaz" mesajı olacaktır.

Ben emin değilim ama muhtemelen DirectoryIterator biraz daha hızlı. Bu liste dosya eklenir veya silinir sadece oluşturulan alır bu yüzden de önbelleğe ekleyin.

Sadece ilk length of prefix karakterleri karşılaştırmak gerekir. Yani bu deneyin:

function DetectPrefix($filePath, $prefix) {
    $dh  = opendir($filePath);
    $len = strlen($prefix);
    $files = array();
    while (false !== ($filename = readdir($dh))) {
        if (substr($filename, 0, $len) === $prefix) {
            $files[] = $filename;
        }
    }
    if (count($files)) {
        return $files;
    } else {
        return null;
    }
}