2014-08-29 62 views
-1

我是PHP的新手,並與我知道我在PHP中建立一個腳本,但一段時間後它崩潰。我在5-6個不同的Linux操作系統,debian,ubuntu,redhat,fedora等上測試過它。只有在Fedora上不會崩潰,但在工作3-4小時後,他會停下來,不要給我任何錯誤。這個過程仍然是開放的,他不會崩潰,只是停止工作,但這隻對Fedora。PHP我的履帶崩潰後一段時間分段錯誤錯誤

這裏是我的腳本代碼:

<? 

ini_set('max_execution_time', 0); 
include_once('simple_html_dom.php'); 

$file = fopen("t.txt", "r"); 
while(!feof($file)) { 
    $line = fgets($file); 
    $line = trim($line); 
    $line = crawler($line); 
} 
fclose($file); 

function crawler($line) { 
    $site = $line; 
    // Check target. 
    $agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; pt-pt) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"; 
    $ch=curl_init(); 
    curl_setopt ($ch, CURLOPT_URL,$line); 
    curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch,CURLOPT_VERBOSE,false); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
    curl_exec($ch); 
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    if($httpcode>=200 && $httpcode<=300) { 

     $check2 = $html = @file_get_html($site); 
     if($check2 === false) { 
      return $line; 
     } else { 
      foreach($html->find('a') as $element) { 
       $checkurl = parse_url($element->href); 
       $checkline = parse_url($line); 
       if(isset($checkurl['scheme'], $checkurl['host'])) { 
        if($checkurl['host'] !== $checkline['host']) { 
         $split = str_split($checkurl['host']); 
         $replacethis = "."; 
         $replacewith = "dot"; 

         for($i=0;$i<count($split);$i++) { 
          if($split[$i] == $replacethis) { 
          $split[$i] = $replacewith; 
          } 
         } 
         chdir('C:\xampp\htdocs\_test\db'); 
         foreach($split as $element2) { 
          if(!chdir($element2)) { mkdir($element2); chdir($element2); }; 
         } 
         $save = fopen('results.txt', 'a'); $txt = "$line,$element->innertext\n"; fwrite($save,$txt); fclose($save); 
        } 
       } 
      } 
     } 
    } 
} 

?> 

所以我的劇本從爬在我指定t.txt的目標,但只傳出反向所有的反向鏈接......然後他就擴展目錄和保存信息。

這裏是我得到的錯誤:

Allowed memory size of 16777216 bytes exhausted (tried to allocate 24 bytes) 
Segmentation fault (core dumped) 

這冥冥中似乎是一個錯誤..什麼是錯的......任何IDEEA?謝謝。

回答

0

當您沒有空閒內存時,可能會拋出此類錯誤。我相信它發生在你的simple_html_dom裏面。你需要同時使用它來使用

void clear() Clean up memory. 

環路根據its documentation

而且在執行每行兩個HTTP請求。但只有一個捲曲請求就足夠了。只要保存性反應

$html = curl_exec($ch); 

,比使用str_get_html($html)代替file_get_html($site);

也很不好的做法,使用錯誤抑制操作@。如果它能拋出異常,你最好通過try ... catch施工來處理。

而且你不需要做這種事情

$site = $line; 

只使用$line

終於而不是你的長行的$save = fopen('results.txt', 'a');...............您可以使用簡單的file_put_contents()

我建議你輸出來控制你現在正在做什麼。像

echo "getting HTML from URL ".$line 
echo "parsing text..." 

,所以你可以控制的過程在某種程度上

+0

好...謝謝...就像我說我是新手,我不知道如何優化代碼...顯然是地方..有些事情是錯誤的...我會審查你說的每一步:)再次感謝。 – 2014-08-29 23:17:42