2012-12-21 177 views
-1

我有這樣的問題:這個腳本會檢查鏈接一定名單的PageRank。當我插入〜150個鏈接它完美,但如果我把鏈接大量它讓我看到以下錯誤:PHP致命錯誤:最大的執行時間超過

enter image description here

這是代碼:

<?php 
    error_reporting(E_ALL & ~E_NOTICE); 
    function StrToNum($Str, $Check, $Magic) 
    { 
     $Int32Unit = 4294967296; // 2^32 

     $length = strlen($Str); 
     for ($i = 0; $i < $length; $i++) { 
      $Check *= $Magic;  
      if ($Check >= $Int32Unit) { 
       $Check = ($Check - $Int32Unit * (int) ($Check/$Int32Unit)); 

       $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check; 
      } 
      $Check += ord($Str{$i}); 
     } 
     return $Check; 
    } 
    function CheckHash($Hashnum) 
    { 
     $CheckByte = 0; 
     $Flag = 0; 

     $HashStr = sprintf('%u', $Hashnum) ; 
     $length = strlen($HashStr); 

     for ($i = $length - 1; $i >= 0; $i --) { 
      $Re = $HashStr{$i}; 
      if (1 === ($Flag % 2)) {    
       $Re += $Re;  
       $Re = (int)($Re/10) + ($Re % 10); 
      } 
      $CheckByte += $Re; 
      $Flag ++;  
     } 

     $CheckByte %= 10; 
     if (0 !== $CheckByte) { 
      $CheckByte = 10 - $CheckByte; 
      if (1 === ($Flag % 2)) { 
       if (1 === ($CheckByte % 2)) { 
        $CheckByte += 9; 
       } 
       $CheckByte >>= 1; 
      } 
     } 

     return '7'.$CheckByte.$HashStr; 
    } 
    function HashURL($String) 
    { 
     $Check1 = StrToNum($String, 0x1505, 0x21); 
     $Check2 = StrToNum($String, 0, 0x1003F); 

     $Check1 >>= 2;  
     $Check1 = (($Check1 >> 4) & 0x3FFFFC0) | ($Check1 & 0x3F); 
     $Check1 = (($Check1 >> 4) & 0x3FFC00) | ($Check1 & 0x3FF); 
     $Check1 = (($Check1 >> 4) & 0x3C000) | ($Check1 & 0x3FFF);  

     $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2) | ($Check2 & 0xF0F); 
     $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000); 

     return ($T1 | $T2); 
    } 
    function getpagerank($url) { 
     $query="http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=".CheckHash(HashURL($url)). "&features=Rank&q=info:".$url; 
     $data=file_get_contents($query); 
     $pos = strpos($data, "Rank_"); 
     if($pos === false){} else{ 
      $pagerank = substr($data, $pos + 9); 
      return $pagerank; 
     } 


    } 
    if($_POST['urls']) 
    { 
     ?><table border="1"> 
     <th>URL</th> 
     <th>Pagerank</th> 
     <? 
     $urls=trim($_POST['urls']); 
     $url=explode("\n",$urls); 
     foreach($url as $url) 
     { 
      if($url) 
      { 
       $url=trim($url); 
       $pagerank=getpagerank($url); 
       ?> 
       <tr><td><?php echo $url; ?></td><td><?php echo $pagerank; ?></td></tr> 
       <?   
       flush(); 
      }     
     } 
     ?></table><? 
    } 
    else 
    { 
     ?><form action="" method="post"> 
     URLS:<br /><textarea name="urls" cols="50" rows="10">http://www.google.com 
    http://www.yahootracer.com</textarea><br /><input type="submit" value="Check PR"/> 
     </form> 
     <? 
    } 
    ?> 
+0

你們是不是要優化代碼之後添加set_time_limit(0),或者你只是希望它運行,無論長短?如果是後者,則可以在配置中調整超時。 – RonaldBarzell

+0

嘗試在腳本的開頭放置'set_time_limit(0);'並查看是否解決了問題。您還可以編輯你的php.ini有同樣的效果:http://php.net/manual/en/info.configuration.php – user1909426

+0

很多關於PHP最大執行時間上做題。檢查實例以下鏈接http://stackoverflow.com/questions/1420249/maximum-execution-time-of-60-seconds-exceeded-error?rq=1。 – brezanac

回答

3

你已達到默認腳本執行超時。您可以嘗試使用set_time_limit(0)來禁用超時。但是,可能您正在webserver下運行您的腳本 - 那麼可以應用webserver超時,這是無法避免的,並且由系統管理員配置。在這種情況下 - 最好的辦法是通過運行一個shell腳本來執行巨大的插入操作(例如cronjob)。

+0

在我看來,還是一個更好的答案。至少我能做的是高舉它。 – brezanac

1

必須行 $query="http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=".CheckHash(HashURL($url)). "&features=Rank&q=info:".$url;

+0

爲什麼存在而不是全局在文件的第一行?任何特定的原因? –

+2

非常感謝,它工作! –

+0

最好是把'set_time_limit'在腳本的開頭有以下幾個原因最顯着的可讀性和set_time_limit'工作方式'。你看每次調用'set_time_limit'你實際上是復位內部定時器,如果它前面的線需要很長的時間來執行,你可能會接觸到其中'set_time_limit'將永遠不會被執行的情況時。這就是爲什麼它應該在劇本的開頭。 – brezanac

相關問題