11
> 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:
>
> 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)>
}
?>