为什么这段PHP代码在远程主机上不能正常工作,但在本地主机上却能正常工作


why this PHP code is not working properly on remote host but works well on localhost

我使用这段代码来获取谷歌页面排名。它在我的本地主机上运行得很好,但当我在主机(linux-php5)上使用它时,它返回零秩。代码:

<html>
<head>
<title>GPR</title>
<body>
<?php
function ZeroFill($a,$b){
  $z=hexdec(80000000);
  if($z&$a){
    $a=($a>>1);
    $a&=(~$z);
    $a|=0x40000000;
    $a=($a>>($b-1));
  }else{
    $a=($a>>$b);
  }
  return $a;
}
define('GOOGLE_MAGIC',0xE6359A60);
function Mix($a,$b,$c){
  $a-=$b;$a-=$c;$a^=(ZeroFill($c,13));
  $b-=$c;$b-=$a;$b^=($a<<8);
  $c-=$a;$c-=$b;$c^=(ZeroFill($b,13));
  $a-=$b;$a-=$c;$a^=(ZeroFill($c,12));
  $b-=$c;$b-=$a;$b^=($a<<16);
  $c-=$a;$c-=$b;$c^=(ZeroFill($b,5));
  $a-=$b;$a-=$c;$a^=(ZeroFill($c,3));
  $b-=$c;$b-=$a;$b^=($a<<10);
  $c-=$a;$c-=$b;$c^=(ZeroFill($b,15));
  return array($a,$b,$c);
}
function GoogleCH($url,$length=null,$init=GOOGLE_MAGIC){
  if(is_null($length)){
    $length=sizeof($url);
  }
  $a=$b=0x9E3779B9;
  $c=$init;
  $k=0;
  $len=$length;
  while($len>=12){
    $a+=($url[$k+0]+($url[$k+1]<<8)+($url[$k+2]<<16)+($url[$k+3]<<24));
    $b+=($url[$k+4]+($url[$k+5]<<8)+($url[$k+6]<<16)+($url[$k+7]<<24));
    $c+=($url[$k+8]+($url[$k+9]<<8)+($url[$k+10]<<16)+($url[$k+11]<<24));
    $mix=Mix($a,$b,$c);
    $a=$mix[0];$b=$mix[1];$c=$mix[2];
    $k+=12;
    $len-=12;
  }
  $c+=$length;
  switch($len){
    case 11:$c+=($url[$k+10]<<24);
    case 10:$c+=($url[$k+9]<<16);
    case 9:$c+=($url[$k+8]<<8);
    case 8:$b+=($url[$k+7]<<24);
    case 7:$b+=($url[$k+6]<<16);
    case 6:$b+=($url[$k+5]<<8);
    case 5:$b+=($url[$k+4]);
    case 4:$a+=($url[$k+3]<<24);
    case 3:$a+=($url[$k+2]<<16);
    case 2:$a+=($url[$k+1]<<8);
    case 1:$a+=($url[$k+0]);
  }
  $mix=Mix($a,$b,$c);
  return $mix[2];
}
function StringOrder($string){
  for($i=0;$i<strlen($string);$i++){$result[$i]=ord($string{$i});}
  return $result;
}
$url="Yahoo.com";
$server="toolbarqueries.google.com";
  $url="info:"."$url";
  $ch=trim(str_replace("-","",sprintf("6%u'n",GoogleCH(StringOrder($url)))));
  $res="http://$server/tbr?client=navclient-auto&ch=$ch&features=Rank&q=$url";
  $data=@fopen("$res",r);
  if($data){
    while($line = fgets($data,1024)) {
      if(substr($line,0,7)=="Rank_1:"){$rankline = $line;}
    }
    fclose($data);
    if (isset($rankline)==false){$rankline="";};
    $pagerank = trim(substr($rankline,9,2));
    if($pagerank==""){$pagerank="0";}
    echo <<<HEADER

<table border=0>
HEADER;
echo "<td nowrap colspan=2><a href='"http://".$url."'">".$url."</a></td>'n";
echo "</tr>";
echo "<tr>";
echo "<td nowrap>Pagerank:&nbsp;&nbsp;</td>";
echo "<td nowrap><b>".$pagerank."</b>&nbsp;&nbsp;</td>'n";
$out = ''; 
echo $out;
echo <<<FOOTER
</table>
</td></tr></table>
</blockquote>
FOOTER;
}
?>
</body>
</html>

为什么?我该怎么修?

您的主机允许您对外部URL使用fopen吗?您可能需要使用CURL。

首先要做的是验证该主机上是否启用了allow_url_fopen

您在开发和生产环境中使用哪些php版本?

检查以下设置,重点是安全模式和fopen()远程资源:

  • 安全模式设置
  • 打开basedir限制
  • 使用远程资源的fopen()