2011-03-02 5 views
7

मुझे एक ऐसा फ़ंक्शन बनाना है जो सभी उपफोल्डर को फ़ोल्डर में सूचीबद्ध करता है। मेरे पास कोई फ़ाइल फ़िल्टर नहीं है, लेकिन फ़ंक्शन लिस्टिंग के लिए स्कैंडर() का उपयोग करता है। इससे एप्लिकेशन बहुत धीमा हो जाता है। क्या स्कैंडिर(), यहां तक ​​कि देशी php फ़ंक्शन का कोई विकल्प नहीं है? अग्रिम धन्यवाद!PHP: स्कैंडर() बहुत धीमा है

+3

निर्देशिका स्कैनिंग में कितनी फ़ाइलें/डीआईआर हैं? यह धीमा नहीं होना चाहिए, जब तक कि आप प्रत्येक डीआईआर पर 'stat() 'नहीं कर रहे हैं, या वहां हजारों फाइलें हैं। –

+0

http://www.php.net/manual/en/function.scandir.php#96326 – Detect

+0

http://www.php.net/manual/en/function.scandir.php#73062 – Detect

उत्तर

2

आप इस तरह 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; 
} 
+0

सब कुछ सही लगता है, लेकिन इसे कैसे अक्षम करें। और .. फ़ोल्डर्स। मेरे पास एक खाली इंडेक्स भी है, जिसे मैं सूचीबद्ध नहीं करना चाहता हूं। मुझे लगता है कि यह पकड़ (अपवाद) में है, लेकिन इसे कैसे प्रारूपित किया जाए? –

+0

Ive अपडेट किया गया है जिसमें इसमें '.' या' ..' शामिल नहीं है लेकिन मुझे यकीन नहीं है कि खाली इंडेक्स – RobertPitt

+0

हाँ के संबंध में आपका क्या मतलब है !!!! यह मेरे लिए पूरी तरह से काम करता है। आप लोगों को धन्यवाद! –

2

अपने स्वयं के बारे में है। पीएचपी एक पुनरावर्ती निर्देशिका इटरेटर इस के लिए विशेष रूप से बनाया गया है:

http://php.net/manual/en/class.recursivedirectoryiterator.php

एक सामान्य नियम के (समय की उर्फ ​​नहीं 100%), क्योंकि यह सीधे सी में लागू हो जाता है, कुछ भी आप PHP में निर्माण करने जा रहा है धीमे हो जाओ।

+1

जब तक आप एक वास्तविक समय सॉफ्टवेयर लिख रहे हों, तो php का "धीमा" सभी – dynamic

+0

पर कोई फर्क नहीं पड़ता है, 'पेरेंटइटरेटर' (या एक bespoke iterator फ़िल्टर) और बाम, निर्देशिका में निर्देशिका इटरेटर को लपेटें। – salathe