|
Как узнать PageRank или особенности алгоритма на PHP.
|
|
Всегда мечтал узнать, как получить PageRank, минуя тулбар от Google, что бы был скрипт, позволяющий получить PR в автоматическом режиме. Полезно, знаете ли, собирать такие сведения о сайтах, особенно когда речь идет о продвижении.
|
|
Поиск привел на страничку со статьей "AJAX скрипт для определения Google Pagerank" (http://allajax.ru/script/ajax-skript-dlya-opredeleniya-google-pagerank). Не очень понятно, зачем нужен AJAX, если основная вычисление PageRank происходит в скрипте pagerank.php, что собственно нам и нужно. Скачиваем архив и получаем заветный файл.
|
|
Из кода видно, что остаточно сформировать строчку вида:
|
|
http://www.google.com/search?client=navclient-auto&ch=62067077616&features=Rank&q=info%3Ahttp%3A%2F%2Fwww.auweb.ru
|
|
и вы получите страницу, на которой отразится PR, примерно в таком виде:
|
|
|
Основной секрет данного скрипта - это формирование последовательности (контрольной суммы) ch=62067077616. Данная последовательность вычисляется по адресу сайта, если контрольная сумма вычислена неправильно, то google выдаст красочную страницу, на которой, в мягкой форме, сообщит, что о вас думает.
|
|
|
Не будем вдаваться в особенности алгоритма, отметим только одну маленькую особенность, этот код работает только на 32 разрядных операционных системах, а на 64 разрядных выдает неправильную последовательность, что приводит к тому, что Google отказывается показывать значение PR.
|
|
Причина проста. Переполнение переменной типа integer в версиях PHP для ОС с разной разрядностью происходит по-разному.
|
|
Немного теории.
|
|
Тип integer занимает 32 бита, в десятичном представлении число может меняться от -2147483648 до 2147483647.
|
|
Что бы понять, как происходит переполнение, представим максимальное число 2147483647 в бинарном виде и прибавим 1:
|
01111111111111111111111111111111
+
00000000000000000000000000000001
=
10000000000000000000000000000000
|
|
А это как раз минимальное число (-2147483648), в бинарном виде старший бит = 1 означает, что число отрицательное. Т.е. если переменная занимает 32 бита и переполнение не контролируется, то мы получим циклическое представление числа, в котором минимальное и максимальное значение отличаются на 1. т.е. отрицательное число меньше (-2147483648) "становиться" положительным.
|
|
Как это работает в PHP.
|
|
Если речь идет о математических действиях (+-*/) то при выходе числа из диапазона значений integer переменная автоматически меняет свой тип на double (размер перемнной 64 бит), но когда речь идет о логических операциях например ^ (Xor) происходит преобразование double к integer.
|
|
Отличие преобразования в целое в разных версиях PHP.
|
|
Если число меньше -2147483648, то:
|
- в PHP для 32-разрядной версии ОС, преобразование происходит циклическим образом, т.е. число становится положительным.
- в PHP для 64-разрядной версии ОС, все числа меньше -2147483648, становятся равными -2147483648.
|
|
Для тех, кто заинтересуется темой более подробно, есть ряд статей: |
|
|
|
Исправление кода.
|
|
В исходной программе при использовании логических функций преобразование происходит не явно, нам же придется написать функцию, по сути - это подобие функции intval, но она работает одинаково как в 32 так и 64 разрядных версиях ОС.
|
function intval_like32()
{
$i_min=-2147483648;
if(intval($i_min-1)!=$i_min) // проверка на то каким образом происходит округление
{
// echo "32 bit";
$iv=intval($iv); //если версия 32 bit то ничего не делаем.
}
else
{
// echo "64 bit";
if($iv!=intval($iv))
{
if($iv<0) //если версия 64 bit и число отрицательное совершаем преобразование
{
$iv=$iv-intval($iv)*2;
}
else $iv=intval($iv); //если версия 64 bit и число положительное ничего не делаем
}
}
return $iv;
}
|
|
Добавляем функцию, исправляем код, окончательный вариант можете скачать здесь, пароль к архиву 12345.
|
|
Размещаем скрипт на сервере, в браузере пишем строчку:
|
|
..pr.php?url=http://www.auweb.ru
|
|
Копирайт
|
|
автор: Auweb_dev
|
|
© ЗАО `Аврора Веб` - При полном или частичном копировании материала, прямая ссылка на сайт www.auweb.ru обязательна.
|