Zur Navigation

Pagerank in Verzeichnis einbauen [2]

11 rolfhub (Gast)

> Hallo,
>
> ich habe auch das Tool bei mir laufen. Nun habe ich meinen Server von PHP4 auf
> PHP5 umgestellt und nun geht das PR Tool nicht mehr.
>
> Soweit ich das Problem eingekreist habe liegt es an den Datentypen oder den
> Operator ^= in der Funktion mix.

Ja, scheint so.

> Hier wird ja die URL Prüfsumme berechnet und das klappt nicht mehr richtig. Die
> Funktion mix liefert unter PHP5 andere Ergebnisse zurück als unter PHP4.

Ich hab eher die Vermutung, dass an Unterschieden zwischen PHP auf einem 32-bit und einem 64-bit-Prozessor liegt. Vermutlich wird für einen Int einfach die Prozessorinterne Darstellung gewählt, die auf einem 64-bit-Prozessor natürlich doppelt breit ist.

> Hat jemand hierfür schon ein Lösung oder Idee?

Ich hab etwas gesucht, etwas probiert, und einiges selbst gecoded, und bin zu folgendem Ergebnis gekommen, das anscheinend problemlos funktioniert:

<?PHP
error_reporting(E_ALL|E_STRICT);

// Code based on: http://www.phpfuncs.org/?goto=33

// <constants>
// Add as many error codes as needed (every error code has to be <0, because normal results are >=0)
define('ERR_BADURL',-1);
define('ERR_NORESULT',-2);
define('ERR_BADRESULT',-3);
define('NOTTRIED',-100);
define('GOOGLE_MAGIC',0xE6359A60);
// </constants>

$debugmode = FALSE;
if (isset($_REQUEST['debugmode']) && $_REQUEST['debugmode']=="1") $debugmode = TRUE;

function GetGooglePagerank($url, $maxretries=3)
{
  // <helper functions>
  if( !function_exists('ZeroFill')):
    // unsigned shift right
    function ZeroFill($a,$b) // $a is being shifted right $b bits
    {
      global $debugmode;
      if ($debugmode){echo "ZeroFill function: Input: [$a, $b]<br>\n";}
      $z=hexdec(80000000);
      if($z&$a)
      {
        $a=($a>>1);
        $a&=(~$z);
        $a|=0x40000000;
        $a=($a>>($b-1));
      }
      else
      {
        $a=($a>>$b);
      }
      if ($debugmode){echo "ZeroFill function: Result: [$a]<br>\n";}
      return $a;
    }
  endif;

  if( !function_exists('toInt32')):
    function toInt32(& $x){
      $z = hexdec(80000000);
      $y = (int)$x;
      if($y==-$z&&$x<-$z){
        $y = (int)((-1)*$x);
        $y = (-1)*$y;
      }
      $x = $y;
    }
  endif;

  if( !function_exists('Mix')):
    function OldMix($a,$b,$c) // Old version, maybe not working on some servers
    {
      global $debugmode;
      if ($debugmode){echo "Mix function: Input: [$a, $b, $c]<br>\n";}
      $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));
      if ($debugmode){echo "Mix function: Result: [$a, $b, $c]<br>\n";}
      return array($a,$b,$c);
    }
    function Mix($a,$b,$c) // New version, should be working
    {
      global $debugmode;
      if ($debugmode){echo "Mix function: Input: [$a, $b, $c]<br>\n";}
      $a -= $b; $a -= $c; toInt32($a); $a = (int)($a ^ (ZeroFill($c,13)));
      $b -= $c; $b -= $a; toInt32($b); $b = (int)($b ^ ($a<<8));
      $c -= $a; $c -= $b; toInt32($c); $c = (int)($c ^ (ZeroFill($b,13)));
      $a -= $b; $a -= $c; toInt32($a); $a = (int)($a ^ (ZeroFill($c,12)));
      $b -= $c; $b -= $a; toInt32($b); $b = (int)($b ^ ($a<<16));
      $c -= $a; $c -= $b; toInt32($c); $c = (int)($c ^ (ZeroFill($b,5)));
      $a -= $b; $a -= $c; toInt32($a); $a = (int)($a ^ (ZeroFill($c,3)));
      $b -= $c; $b -= $a; toInt32($b); $b = (int)($b ^ ($a<<10));
      $c -= $a; $c -= $b; toInt32($c); $c = (int)($c ^ (ZeroFill($b,15)));
      if ($debugmode){echo "Mix function: Result: [$a, $b, $c]<br>\n";}
      return array($a,$b,$c);
    }
  endif;

  if( !function_exists('GoogleCH')):
    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;
      endwhile;
      $c+=$length;
      switch($len) /* all the case statements fall through */
      {
        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];
    }
  endif;

  if( !function_exists('StringOrder')):
    // converts a string into an array of integers containing the numeric value of the char
    function StringOrder($string)
    {
      for($i=0;$i<strlen($string);$i++) $result[$i]=ord($string{$i});
      return $result;
    }
  endif;

  if( !function_exists('MakeSeed')):
    function MakeSeed() // seed with microseconds
    {
      list($usec, $sec) = explode(' ', microtime());
      return (float) $sec + ((float) $usec * 100000);
    }
  endif;

  if( !function_exists('FetchRandomElement')):
    function FetchRandomElement(&$array)
    {
      srand(MakeSeed()); // Seed the random number generator
      return $array[array_rand($array,1)]; // Return random entry
    }
  endif;

  if( !function_exists('GetRank')):
    function GetRank($url)
    {
      global $debugmode;
      if (preg_match("#^(http|https)+(://)+([a-z0-9-_.]{2,}\.[a-z]{2,8})([/a-z0-9-_.,~$]*)$#i",$url)):
        $target=trim($url);
        $server=array();
        // Add as many servers as you wish (but at least one)
        $server[]="www.google.com"; $server[]="toolbarqueries.google.com";
        $server[]="64.233.161.99";  $server[]="64.233.161.104";
        $server[]="66.102.7.99";    $server[]="66.102.7.104";
        $server[]="216.239.59.99";  $server[]="216.239.59.104";
        $server[]="216.239.37.104"; $server[]="216.239.39.99";
        $server[]="216.239.39.104"; $server[]="66.102.11.99";
        $server[]="66.102.11.104";  $server[]="216.239.57.99";
        $server[]="216.239.57.104"; $server[]="66.102.9.99";
        $server[]="66.102.9.104";   $server[]="216.239.53.99";
        $server[]="216.239.53.104";
        $server_current=FetchRandomElement($server);
        $url="info:" . $target;
		$encurl="info:" . urlencode($target);
        $ch=trim(str_replace("-","",sprintf("6%u\n",GoogleCH(StringOrder($url)))));
        $res="http://$server_current/search?client=navclient-auto&ch=$ch&features=Rank&q=$encurl";
        if ($debugmode){echo "Resulting URL: "; var_dump($res); echo "<br>\n";}
        $data=@fopen("$res",r);
        if ($data):
          while($line=fgets($data,1024)){
            if ($debugmode){echo "Response from Server: "; var_dump($line); echo "<br>\n";}
            if (substr($line,0,7)=="Rank_1:"): $rankline=$line; endif;
          }
          fclose($data);
          $pagerank=trim(substr($rankline,9,2));
          if ($pagerank==""): $pagerank="0"; endif;
          if (((int)$pagerank)>10 || ((int)$pagerank)<0) return ERR_BADRESULT;
          return $pagerank; // Seemingly correct result
        else:
          return ERR_NORESULT;
        endif;
      else:
        return ERR_BADURL;
      endif;
    }
  endif;
  // </helper functions>

  // <Body of function GetGooglePagerank($url, $maxretries=3)>
  if ($maxretries>10 || $maxretries<1){ // sane limits for var. $maxretries
    $maxretries=3; // default
  }
  $count=1;
  $result=NOTTRIED;
  while ($count<=$maxretries && $result<=0){
    // Please note: '0' is a valid result, but sometimes
    // some servers do not yet know new URLs, while
    // others already do, so we try again (because maybe
    // we will get a higher result this time).
    $result=GetRank($url);
    $count++;
  }
  return $result;
  // </Body of function GetGooglePagerank($url, $maxretries=3)>
}
?>

30.04.2007 08:39

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]