2012-01-12 8 views
5

मैं कमांड लाइन से नीचे PHP कोड चला रहा हूं। मुद्दा यह है कि इसकी याददाश्त इसकी तुलना में कहीं अधिक है। मैं नहीं कर सकता, मेरे जीवन के लिए, पता लगाएं कि स्मृति कहाँ खाई जा रही है।PHP स्क्रिप्ट मेमोरी लीक मुद्दा

for ($i=0;$i<100;$i++) 
     { 
      $classObject = $classObjects[$i];      

      echo $i . " : " . memory_get_usage(true) . "\n"; 
      $classDOM = $scraper->scrapeClassInfo($classObject,$termMap,$subjectMap);   
      unset($classDOM);   
     } 

मेरे अनुसार, स्मृति मेरी स्क्रिप्ट से भस्म पाश के हर यात्रा के बाद कम या ज्यादा स्थिर रहना चाहिए। $scraper->scrapeClassInfo() द्वारा खपत कोई भी स्मृति मुक्त होनी चाहिए जब उसके सदस्य गुंजाइश से बाहर हो जाएं।

यह मुझे प्राप्त आउटपुट फ़ाइल है। संक्षिप्तता के लिए, मैं उत्पादन के हर 10 वीं लाइन दिखा रही है:

0 : 5767168 
10 : 12058624 
20 : 18350080 
30 : 24903680 
40 : 30932992 
50 : 37748736 
60 : 43778048 
70 : 49807360 
80 : 55836672 
90 : 62914560 
97 : 66846720 

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 44 bytes) in /home/content/60/8349160/html/drexel/simple_html_dom.php on line 1255 

अंत में, जहाँ तक मैं देख सकते हैं, क्या $scraper->scrapeClassInfo() वास्तव में अपराधी नहीं होना चाहिए क्या कर रही है, लेकिन सिर्फ मामले में, यहाँ कोड है:

function scrapeClassInfo($class,$termMap,$subjectMap) 
     { 
      $ckfile = tempnam ("/tmp", "CURLCOOKIE"); 
      $ckfile2 = tempnam ("/tmp", "CURLCOOKIE2"); 
      $ckfile3 = tempnam ("/tmp", "CURLCOOKIE3");   

      $termpage = $termMap[$class['termcode']]; 
      $subjectpage = $subjectMap[$class['subjectcode']]; 
      $classpage = $class['classlink']; 

      //hit the main page and get cookie 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_URL, $this->mainURL); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
      curl_exec($ch); 
      curl_close($ch); 

      //hit the term page and get cookie 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile); 
      curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile2); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_URL, $termpage); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
      curl_exec($ch); 
      curl_close($ch); 

      //hit the subject page and get cookie 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile3); 
      curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile2); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_URL, $subjectpage); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
      curl_exec($ch); 
      curl_close($ch); 

      //hit the class page and scrape 
      $ch = curl_init();    
      curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile3); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_URL, $classpage); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
      $result = curl_exec($ch); 
      curl_close($ch); 

      return str_get_html($result); 
     } 

विधि अंतिम पंक्ति में कहा जाता है, str_get_html()Simple HTML DOM Parser

के एक सदस्य इससे कोई फर्क करना चाहिए है, यह कैसे मैं अपने स्क्रिप्ट बोल रहा हूँ है:

/usr/local/php5/bin/php index.php 2>&1 1>output

उत्तर

3

ठीक है, इसे समझ लिया। जाहिर है, यह एक बग है कि 5.3 से पहले PHP के सभी संस्करण से पीड़ित हैं। CURLOPT_RETURNTRANSFER को true पर सेट करना भारी मेमोरी लीक का कारण बनता है।

मैं स्क्रिप्ट फिर से इस समय php लागू 5.3 द्विआधारी भाग गया,:

/web/cgi-bin/php5_3 index.php 2>&1 1>output 

और आउटपुट फ़ाइल में लिखा है:

0 : 6291456 
10 : 9437184 
20 : 10747904 
30 : 11534336 
40 : 11534336 
50 : 11534336 
60 : 11534336 
70 : 11534336 
80 : 11534336 
90 : 11534336 
99 : 11534336 
152.74998211861 sec 

अब जब कि मैं किस बारे में बात कर रहा हूँ है! पूरी तरह से निरंतर स्मृति पदचिह्न।

+0

बग क्या है? –

+0

जब मैंने "CURLOPT_RETURNTRANSFER को सत्य पर सेट करना" लिखा था, तो मुझे लिखना था कि "CURLOPT_RETURNTRANSFER को वास्तविक कारणों से भारी मेमोरी लीक सेट करना" लिखना है। संपादित। – xbonez

+0

आह। स्पष्टीकरण के लिए +1। –

1

मुझे आपके कोड में निम्नलिखित मिला।

  1. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) हटाएं क्योंकि आप इसे कैप्चर नहीं कर रहे हैं।
  2. कर्ल हैंडल बंद न करें। इसका पुन: उपयोग करें।

एक मौजूदा समाधान के रूप में आप उच्च memroy_limit

$ php -d memory_limit=1G /path/to/script 

1G साथ php स्क्रिप्ट चला सकते हैं 1 गीगाबाइट का मतलब है।

+0

धन्यवाद। निश्चित रूप से सही दिशा में। मैंने 'CUROPT_RETURNTRANSFER' को हटाने का प्रयास किया था, लेकिन आखिरी कर्ल अनुरोध में मैंने इसे छोड़ दिया था, इसलिए मुझे अभी भी स्मृति समस्या थी। वैसे भी, नीचे मेरा जवाब देखें। – xbonez

संबंधित मुद्दे