2012-12-21 126 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

相关问题