मुझे एक ऐसा फ़ंक्शन बनाना है जो सभी उपफोल्डर को फ़ोल्डर में सूचीबद्ध करता है। मेरे पास कोई फ़ाइल फ़िल्टर नहीं है, लेकिन फ़ंक्शन लिस्टिंग के लिए स्कैंडर() का उपयोग करता है। इससे एप्लिकेशन बहुत धीमा हो जाता है। क्या स्कैंडिर(), यहां तक कि देशी php फ़ंक्शन का कोई विकल्प नहीं है? अग्रिम धन्यवाद!PHP: स्कैंडर() बहुत धीमा है
उत्तर
आप इस तरह readdir जो तेजी से हो सकता है, कुछ का उपयोग कर सकते हैं:
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;
}
कुछ tweeking की आवश्यकता हो सकती है, लेकिन इस अनिवार्य रूप से scandir क्या करता है, और यह तेजी से होना चाहिए नहीं तो मैं के रूप में एक अद्यतन लिखें देखना चाहते हैं कि मैं एक तेज समाधान कर सकता हूं।
एक और मुद्दा यह है कि यदि आप एक बहुत बड़ी निर्देशिका पढ़ते हैं तो आप आंतरिक मेमोरी के भीतर एक सरणी भरते हैं और यह हो सकता है कि आपकी याददाश्त कहां जा रही है।
आप ऑफसेट में पढ़ने वाले फ़ंक्शन को आजमा सकते हैं और बना सकते हैं ताकि आप एक समय में 50 फाइलें वापस कर सकें! एक समय में फ़ाइलों की
पढ़ने हिस्सा बस के रूप में उपयोग करने के लिए आसान होगा, इसलिए जैसा होगा:
$offset = 0;
while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset)))
{
//Use $batch here which contains 50 or less files!
//Increment the offset:
$offset += 50;
}
सब कुछ सही लगता है, लेकिन इसे कैसे अक्षम करें। और .. फ़ोल्डर्स। मेरे पास एक खाली इंडेक्स भी है, जिसे मैं सूचीबद्ध नहीं करना चाहता हूं। मुझे लगता है कि यह पकड़ (अपवाद) में है, लेकिन इसे कैसे प्रारूपित किया जाए? –
Ive अपडेट किया गया है जिसमें इसमें '.' या' ..' शामिल नहीं है लेकिन मुझे यकीन नहीं है कि खाली इंडेक्स – RobertPitt
हाँ के संबंध में आपका क्या मतलब है !!!! यह मेरे लिए पूरी तरह से काम करता है। आप लोगों को धन्यवाद! –
अपने स्वयं के बारे में है। पीएचपी एक पुनरावर्ती निर्देशिका इटरेटर इस के लिए विशेष रूप से बनाया गया है:
http://php.net/manual/en/class.recursivedirectoryiterator.php
एक सामान्य नियम के (समय की उर्फ नहीं 100%), क्योंकि यह सीधे सी में लागू हो जाता है, कुछ भी आप PHP में निर्माण करने जा रहा है धीमे हो जाओ।
निर्देशिका स्कैनिंग में कितनी फ़ाइलें/डीआईआर हैं? यह धीमा नहीं होना चाहिए, जब तक कि आप प्रत्येक डीआईआर पर 'stat() 'नहीं कर रहे हैं, या वहां हजारों फाइलें हैं। –
http://www.php.net/manual/en/function.scandir.php#96326 – Detect
http://www.php.net/manual/en/function.scandir.php#73062 – Detect