Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] GooglePageRank
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
shpyo
Muszę zaznaczyć, że nie jestem jego 100% autorem, gdyż w sieci znalazłem gotowe rozwiązanie (kilka funkcji). Moja rola ograniczyła się raczej do przepisania tego na wersję obiektową, tak aby było to łatwe i przyjemne w użytkowaniu
  1. <?php
  2. /**
  3. * Klasa Google PageRank
  4. *
  5. * Klasa pobiera PR dla podenego adresu URL, z google.com (domy�lny DC) lub z podanych DC
  6. *
  7. * @author nieznany
  8. * @modyfications Piotr 'shpyo' Cichosz
  9. * @version 1.0 2007/06/04
  10. */
  11. class googlePageRank
  12. {
  13. /**
  14. * Pole $googleMagic
  15. *
  16. * Stała dana Google
  17. */
  18. var $googleMagic = 0xE6359A60;
  19.  
  20. /**
  21. * Pole $arrResults
  22. *
  23. * Tablica z DC, na których będzie sprawdzany PR
  24. */
  25. var $arrResults = array();
  26.  
  27. /**
  28. * Konstruktor
  29. *
  30. * Pobieranie PR na podanych DC
  31. */
  32. function googlePageRank( $resUrl, $arrDC = array( 'www.google.com') ) 
  33. {
  34. $strQuery = 'info:'.$resUrl;
  35. $ch = $this->GoogleCH( $this->strord( $strQuery ) );
  36. for( $i=0,$ile=count($arrDC); $i<$ile; $i++ )
  37. {
  38. $resUrl = "http://".$arrDC[$i]."/search?client=navclient-auto&ch=6$ch&features=Rank&q=$strQuery";
  39. $resPage = file( $resUrl );
  40. $rankarray = explode( ':', $resPage[0] );
  41. $this->arrResults[$i]['dc'] = $arrDC[$i];
  42. $this->arrResults[$i]['pagerank'] = $rankarray[2];
  43. }
  44. }
  45.  
  46. /**
  47. * Metoda GoogleCH
  48. *
  49. * Tworzenie sumy kontrolnej dla sprawdzanego URL
  50. */
  51. function GoogleCH( $resUrl )
  52. {
  53. if( is_null( $length ) )
  54. $length = sizeof( $resUrl );
  55.  
  56. $a = $b = 0x9E3779B9;
  57. $c = $this->googleMagic;
  58. $k = 0;
  59. $len = $length;
  60. while($len >= 12) {
  61. $a += ($resUrl[$k+0] +($resUrl[$k+1]<<8) +($resUrl[$k+2]<<16) +($resUrl[$k+3]<<24));
  62. $b += ($resUrl[$k+4] +($resUrl[$k+5]<<8) +($resUrl[$k+6]<<16) +($resUrl[$k+7]<<24));
  63. $c += ($resUrl[$k+8] +($resUrl[$k+9]<<8) +($resUrl[$k+10]<<16)+($resUrl[$k+11]<<24));
  64. $mix = $this->mix( $a, $b, $c );
  65. $a = $mix[0];
  66. $b = $mix[1];
  67. $c = $mix[2];
  68. $k += 12;
  69. $len -= 12;
  70. }
  71.  
  72. $c += $length;
  73. switch($len)
  74. {
  75. case 11: $c+=($resUrl[$k+10]<<24);
  76. case 10: $c+=($resUrl[$k+9]<<16);
  77. case 9 : $c+=($resUrl[$k+8]<<8);
  78. case 8 : $b+=($resUrl[$k+7]<<24);
  79. case 7 : $b+=($resUrl[$k+6]<<16);
  80. case 6 : $b+=($resUrl[$k+5]<<8);
  81. case 5 : $b+=($resUrl[$k+4]);
  82. case 4 : $a+=($resUrl[$k+3]<<24);
  83. case 3 : $a+=($resUrl[$k+2]<<16);
  84. case 2 : $a+=($resUrl[$k+1]<<8);
  85. case 1 : $a+=($resUrl[$k+0]);
  86. }
  87. $mix = $this->mix($a,$b,$c);
  88.  
  89. return $mix[2];
  90. }
  91.  
  92. function zeroFill($a, $b)
  93. {
  94. $z = hexdec(80000000);
  95. if ($z & $a)
  96. {
  97. $a = ($a>>1);
  98. $a &= (~$z);
  99. $a |= 0x40000000;
  100. $a = ($a>>($b-1));
  101. }
  102. else
  103. $a = ($a>>$b);
  104.  
  105. return $a;
  106. }
  107.  
  108. function mix($a,$b,$c) 
  109. {
  110. $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c,13));
  111. $b -= $c; $b -= $a; $b ^= ($a<<8);
  112. $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b,13));
  113. $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c,12));
  114. $b -= $c; $b -= $a; $b ^= ($a<<16);
  115. $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b,5));
  116. $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c,3));
  117. $b -= $c; $b -= $a; $b ^= ($a<<10);
  118. $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b,15));
  119.  
  120. return array($a,$b,$c);
  121. }
  122.  
  123. /**
  124. * Metoda strord
  125. *
  126. * Zamienia każdy znak adresu URL na ASCII
  127. */
  128. function strord($strUrl) 
  129. {
  130. $arrResult = array();
  131. for($i=0;$i<strlen($strUrl);$i++) {
  132. $arrResult[$i] = ord($strUrl[$i]);
  133. }
  134. return $arrResult;
  135. }
  136.  
  137. }
  138. ?>

Przykład użycia:
  1. <?php
  2. //definiowanie tablicy z DC, na których będzie sprawdzany PR
  3. /*$arrDC[0] = "64.233.161.99";
  4. $arrDC[1] = "64.233.161.104";
  5. $arrDC[2] = "64.233.163.99";
  6. $arrDC[3] = "216.239.57.99";
  7. $arrDC[4] = "66.102.11.107";*/
  8.  
  9. if( $_GET['url'] )
  10. {
  11. //tworzenie obiektu googlePageRank
  12. $intPR = new googlePageRank( $_GET['url']/*, $arrDC*/ );
  13.  
  14. //wydruk pobranych danych
  15. echo '<pre>';
  16. print_r( $intPR->arrResults );
  17. echo '</pre>';
  18. }
  19. ?>


Komentarze mile widziane winksmiley.jpg
Na forum jak i na moim blogu: http://blog.shpyo.net/?newsID=51 smile.gif
sf
Hm. Też te funkcje sobie kiedyś skleiłem w klasę, ale w porównaniu z Twoim przykładem mój będzie działał na większości serwerów. Użyłeś file na pliku zdalnym co jest w większości serwerów zablokowane. Do tego używa się CURL. No i teraz warto pisać wszystko pod PHP5.. PHP4 jest dla ludzi, którzy się nie rozwijają i stoją w miejscu.
Moli
Jak dla mnie, to niepotrzebne użycie OOP. Miałem kiedyś funkcję, która robiła dokładnie to samo. Jak już naprawdę chcesz to OOP, to jak powiedział sf, pisz w php 5 i dodaj dodatkowe metody (np. dajesz tablice z różnymi stronami i metoda zwraca tablice z pr dla każdej z tych stron) które uatrakcyjnią klasę.
shpyo
@sf: klasa powstała dla ogółu. Większość webmasterów nie ma dostępu do najnowszej wersji PHP i nie na wszystkich serwerach jest włączona opcja CURL. Nie wszyscy mają dostęp do najnowszych wersji jak Ty.

@Moli: fajny pomysł z rozbudowaniem klasy o możliwość sprawdzania za jednym razem więcej niż jedną stronę.
SongoQ
Cytat
Większość webmasterów nie ma dostępu do najnowszej wersji PHP
Z tym sie nie zgodze. PHP5 jest juz od wielu lat na serwerach i to na wiekszosci. Jak sie cos jeszce znajdzie z 4 to pojerzewam ze cos godnego nie polecania.
sf
@shpyo: jaki hosting nie ma PHP5? dużo osób to powtarza, ale na prawdę trudno znaleźć hosting, który by nie miał "piątki". na ovh jest php5 na darmowych kontach, na nazwa jest, na kei jest, na iq jest, home, az jest

co do curl to zdarzyło mi się, że nie było na strefa, ale napisałem emaila i mi włączyli, plpgsql też nie ma na wielu serwerach, ale wystarczy napisać i to włączą, za to dostęp do zdalnych plików przez file jest wyłączone na większości z uwagi na bezpieczeństwo
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.