‘ PHP ’ category archive

Облегчаем жизнь с помощью PHP.JS

January 15, 09 by TracKer

Часто работая над созданием различных интернет-проектов программист сталкивается с необходимостью написания какого-то кода на JavaScript. Однако при этом легко можно столкнуться с проблемой нехватки функций. :) Например мне недавно нужно было сгенерировать MD5 на стороне клиента, пришлось бы искать альтернативу, если бы я не знал о PHP.JS. Когда-то прочитав о нем, пользуюсь и по сей день. С тех пор количество функций увеличилось до 263 и продолжает увеличиваться. Еще один плюс, что не обязательно использовать файл который предоставляется в проекте целиком, необходимые функции можно вынести и тем самым облегчить работу Браузера клиента.

Сайт проекта: http://phpjs.org

Список функций: http://phpjs.org/functions/index

Блог разработки: http://kevin.vanzonneveld.net/techblog/article/phpjs_licensing/

В ближайшее время на сайте проекта планируется добавить функцию компиляции необходимых функций в один файл, чтобы исключить ненужные.

feof() не знает о конце файла

May 16, 08 by TracKer

Интересной и, кстати сказать, очень неожиданной новостью для меня стало то, что feof() на самом деле не знает о конце файла, прочитали ли мы последний символ/байт или все еще готовы читать дальше.

Собственно поподробнее.

Писал я маленький скрипт, ориентированный на использование бинарных файлов. В общем-то все было уже готово, однако в самый последний момент было обнаружено, что по непонятной причине в буфере к прочитанным данным почему-то приплюсовывается дополнительно 10 байт данных (забитых нулями). Я не мог понять почему fread() читает за пределами файла, а feof() не находит его конец, прочитывая последний байт. Провозился 4 часа, потом решил поискать… И нашел.

Принцип работы с функцией feof() следующий:  необходимо дочитать до конца файла, а потом прочитать еще один или более символов/байт за пределами файла, и только после этого feof() поймет что файл всетаки кончился.

Оказывается об этом люди знали еще в 2005 году, однако никакого намека в мануале PHP найти не удалось. Есть даже заявление на исправление ошибки в баг-трейсе, однако по комментарию одного из разработчиков становится понятно, что это скорее фича языка, чем баг.

Особенно эта фича рулит при работе с бинарными файлами, где каждый байт на счету. :)

Будте внимательны, фичи на каждом шагу! ;)

Как избавиться от внешних ссылок в WordPress

January 20, 08 by TracKer

Спросил меня недавно NOMAD “Как избавиться от ВС в комментариях”, решил поделиться опытом, как это сделать в WordPress.

Первое что важно запомнить, это то что ссылки на комментаторов нельзя ни в коем случае удалять, это признак плохого тона автора блога. Удаляя ссылку вы разрушаете связь с комментатором. Вместо этого ссылку можно немного модифицировать, отправив ее, например, через скрипт переадресации. Таким образом Внешний Адрес будет находится как-бы в вашем домене, и как Внешняя Ссылка учитываться не будет.

О том как сделать скрипт переадресации я писал в этом посте: Убираем внешние ссылки. Сделать нужно все что написано в посте, вплоть до запрета его индексации в robots.txt.

Как только скрипт готов идем в папку с темплейтом вашего блога, к примеру “/wp-content/themes/default/” находим файл “functions.php” и редактируем его.

Перед тем как перейти непосредственно к редактированию, разберем основные источники ВС в блоге на WordPress и методы борьбы с ними.

И так первый источник ВС это ссылки на автора темы. Обычно они расположен в футере (footer.php), но бывают и исключения, поэтому первым делом следует прошерстить темплейт на их наличие. Бороться с ними не сложно. Такие ссылки можно просто взять в “<noindex>“, примерно так:

<noindex>Powered by <a href="http://wordpress.org/">WordPress</a></noindex>

Все что попадает в “<noindex>” не будет учитываться роботом Яндекса, поэтому с этим тегом нужно быть по осторожнее.

Со статическими ВС разобрались, теперь приступим к динамическим. Осталось несколько мест где могут появляться ВС, это: посты (содержание постов), комментарии и sidebar (их может быть несколько и называться они могут по разному, но это сути не меняет). Теперь перейдем непосредственно к редактированию “functions.php” о котором я писал выше.

Начнем с Постов. Чтобы избавиться от ВС в содержании поста необходимо поставить фильтр на “the_content”. Система фильтров в WordPress очень хорошо развита и позволяет фильтровать практически все что угодно. Итак ставим фильтр:

add_filter('the_content', 'removeLinks');

Вторым параметром к add_filter мы указываем функци, которая и будет фильтровать текст. Собственно код функции:

function preg_callback2($matches) {
  $url = explode(':', $matches[2]);
  if (($url[0] == 'http') || ($url[0] == 'https')) {
    $need = "http://tracker2k.kiev.ua";
    $replace = "http://tracker2k.kiev.ua/redirect.php?";
    if (substr($matches[2], 0, strlen($need)) != $need) {
      $matches[2] = $replace.$matches[2];
    }
  }
  return $matches[1].$matches[2].$matches[3];
} 
 
function removeLinks($content) {
  if (! is_feed()) {
    $content = preg_replace_callback('@(]*href=")([^>\"]*)("[^>]*>)@i', "preg_callback2", $content);
    $content = preg_replace_callback('@(]*href=\')([^>\"]*)(\'[^>]*>)@i', "preg_callback2", $content);
  }
  return $content;
}

Для замены ссылок я использовал регулярные выражения, поэтому добавилась еще одна функция обратного вызова. Чтобы адаптировать под себя вам следует заменить всего два параметра в функции preg_callback2, а именно $need и $replace. В $need следует указать полный адрес вашего сайта без слеша в конце, а в $replace путь в redirect.php со знаком вопроса (“?“) в конце. В принципе с постами мы закончили.

Теперь перейдем к комментариям. С ними, в принципе, дела обстоят точно также. Следует отфильтровать всего три – четыре параметра, с использованием описанной выше функции. Другими словами к написанному выше следует дописать:

add_filter('comment_text', 'removeLinks');
add_filter('get_comment_author_link', 'removeLinks');
add_filter('get_comment_author_url_link', 'removeLinks');
add_filter('comment_url', 'removeLinks');

Идем дальше. Следующим пунктом идет sidebar. С ним сложнее всего. С сайдбаре может быть множество виджетов генерируемых другими плагинами, которые в свою очередь генерируют ВС. Однако весь сайдбар ставить в <noindex> было бы ошибкой, так как можно лишится индексации многих страниц и разделов. Я расскажу о тех Виджетах с которыми работал.

Проше всего бороться с ВС у виджета Text, в нем у меня лежали каунтеры, кнопки и пр. Тут всеголишь следует добавить в начало и конец кода в Виджете “<noindex>” и “</noindex>” соответственно. Далее виджет Links, он используется для генерации Blogroll. Тут необходимо установить еще один фильтр и написать еще одну функцию:

function removeLinks_Blogroll($p1) {
  foreach ($p1 as $obj) {
    $obj->link_url = "http://tracker2k.kiev.ua/redirect.php?" . $obj->link_url;
  }
  return $p1;
} 
 
add_filter('get_bookmarks', 'removeLinks_Blogroll');

Подразумевается, что в Blogroll все ссылки Внешние, поэтому их проверка не производится. Чтобы адаптировать под себя, следует заменить “http://tracker2k.kiev.ua/redirect.php?” на то же значения что и $replace в preg_callback2. Также генерировать ВС может виджет Meta, вместо него я использую собственный, заменяющий его. Чтобы внести изменения в остальные виджеты генерирующие ВС необходимо править код WordPress, что весьма не хорошо. Некоторые виджеты, работающие на базе дополнительных плагинов дают возможность вставлять свои теги в свои начало и конец, например Flickr.
Собственно все.

В итоге у вас должен получиться следующий код:

function preg_callback2($matches) {
  $url = explode(':', $matches[2]);
  if (($url[0] == 'http') || ($url[0] == 'https')) {
    $need = "http://tracker2k.kiev.ua";
    $replace = "http://tracker2k.kiev.ua/redirect.php?"; 
 
    if (substr($matches[2], 0, strlen($need)) != $need) {
      $matches[2] = $replace.$matches[2];
    }
  }
  return $matches[1].$matches[2].$matches[3];
} 
 
function removeLinks($content) {
  if (! is_feed()) {
    $content = preg_replace_callback('@(]*href=")([^>\"]*)("[^>]*>)@i', "preg_callback2", $content);
    $content = preg_replace_callback('@(]*href=\')([^>\"]*)(\'[^>]*>)@i', "preg_callback2", $content);
  }
  return $content;
} 
 
add_filter('the_content', 'removeLinks');
add_filter('comment_text', 'removeLinks');
add_filter('get_comment_author_link', 'removeLinks');
add_filter('get_comment_author_url_link', 'removeLinks');
add_filter('comment_url', 'removeLinks');  
 
function removeLinks_Blogroll($p1) {
  foreach ($p1 as $obj) {
    $obj->link_url = "http://tracker2k.kiev.ua/redirect.php?" . $obj->link_url;
  }
  return $p1;
} 
 
add_filter('get_bookmarks', 'removeLinks_Blogroll');

Определение браузера и ОС клиента

November 18, 07 by TracKer

В PHP есть встроенная функция get_browser(), которая позволяет определить каким browser’ом пользуется клиент.

mixed get_browser ( [string $user_agent [, bool $return_array]] )

Все бы было хорошо, но данная функция привязана к INI файлу (browscap.ini), который не поставляется в стандартной сборке PHP, требует определенной настройки и периодического обновления INI файла, содержащего информация о браузерах. Все это обычно не работает на хостингах, а если и работает, то browscap.ini, скорее всего, очень древний и толку от него мало.

В поисках решения я обнаружил интересный проект Джонатана Стоппани “Browser Capabilities PHP Project“. Автор проекта написал класс который служит заменой функции get_browser(). Класс называется Browscap и позволяет подключить browscap.ini динамически, он преобразует browscap.ini в понятный для PHP массив и далее работает с уже ним, но коме этого он умеет автоматически производить обновление библиотеки browscap.ini через определенный промежуток времени.

Кроме всего выше перечисленного класс позволяет определить такие данные о браузере клиента как Платформу (ОС), Поддержку Java и JavaScript, Робот ли клиент (Google, Yandex) и много другого.

Пример:

// Loads the class 
require 'Browscap/Browscap.php';
 
// Creates a new Browscap object (loads or creates the cache) 
$bc = new Browscap('Browscap/cache'); 
 
// Gets information about the current browser's user agent 
$current_browser = $bc->getBrowser(); 
 
// Output the result 
print_r($current_browser);

Результат выполнения:

Array
(
    [browser_name] => Opera/9.23 (Windows NT 5.1; U; ru)
    [browser_name_regex] => ^opera/9\.2.* \(windows nt 5\.1.*\).*$
    [browser_name_pattern] => Opera/9.2* (Windows NT 5.1*)*
    [Parent] => Opera 9.2
    [Platform] => WinXP
    [Win32] => 1
    [Browser] => Opera
    [Version] => 9.2
    [MajorVer] => 9
    [MinorVer] => 2
    [Frames] => 1
    [IFrames] => 1
    [Tables] => 1
    [Cookies] => 1
    [BackgroundSounds] => 1
    [JavaApplets] => 1
    [JavaScript] => 1
    [CSS] => 2
    [CssVersion] => 2
    [supportsCSS] => 1
    [Alpha] => 
    [Beta] => 
    [Win16] => 
    [Win64] => 
    [AuthenticodeUpdate] => 
    [CDF] => 
    [VBScript] => 
    [ActiveXControls] => 
    [Stripper] => 
    [isBanned] => 
    [WAP] => 
    [isMobileDevice] => 
    [isSyndicationReader] => 
    [Crawler] => 
    [AOL] => 
    [aolVersion] => 0
    [netCLR] => 
    [ClrVersion] => 0
)

Browscap качаем тут: http://garetjax.info/projects/browscap/#download
Сам browscap.ini можно взять тут: http://browsers.garykeith.com/downloads.asp

Убираем внешние ссылки

November 17, 07 by TracKer

Недавно писал про искоренение “ссылок через скрипт-редирект” непосредственно в браузере конечного пользователя. Теперь же хочу написать про совсем маленький скрипт который осуществляет этот редирект и помогает избавиться от внешних ссылок.

Применяют такой скрипт в определенных случаях, например: при искоренение внешних ссылок в случае их продажи, например в sape.ru, при подсчет кликов по ссылкам (при клике сначала статистические данные заносятся в БД, после чего осуществляется переадресация на нужный ресурс).

А сам скрипт совсем маленький, фактически вот он:

<?
$uri = "";
if (array_key_exists("QUERY_STRING", $_SERVER)) {
  $uri = $_SERVER["QUERY_STRING"];
}
header("Location: ".$uri);
?>

И все :) . Файл называется redirect.php и находится в корне вашего сайта (чтобы к нему было легче обращаться).

Обращаться же к нему необходимо следующим образом: если нужно сделать переадресацию на http://google.com, то необходимо указать следующий адрес в ссылке:

http://yoursite.com/redirect.php?http://www.google.com.

Если вы используете sape.ru, то это не запрещено их правилами и хорошо действует для избавления от внешних ссылок, но стоит также помнить, что такие ссылки очень плохо индексируются роботами (Google, Yandex), поэтому к ним лучше запретить доступ роботов через файл robots.txt со следующим содержанием:

User-Agent: *
Disallow: /redirect.php

Это значит что все ссылки которые начинаются с “/redirect.php” роботом обрабатываться не будут.