Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [klasa] GooglePageRank
shpyo
post
Post #1





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Na forum jak i na moim blogu: http://blog.shpyo.net/?newsID=51 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sf
post
Post #2





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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.

Ten post edytował sf 10.07.2007, 08:54:41
Go to the top of the page
+Quote Post
Moli
post
Post #3





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
shpyo
post
Post #4





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


@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ę.
Go to the top of the page
+Quote Post
SongoQ
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
sf
post
Post #6





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


@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

Ten post edytował sf 10.07.2007, 10:39:53
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 01:56