2014-08-29 69 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