The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Раздел полезных советов: Ускорение get_browser() в PHP"
Отправлено auto_tips, 11-Янв-08 08:09 
В PHP есть очень удобная для разного рода статистики машин функция - get_browser().
Она возвращает по юзерагенту объект, содержащий отфильтрованный набор информации
о браузере и его системе, как то имя, платформа, версия и т.п. "Т.п." - это набор информации,
о поддержке кук, дотнета и еще кучи всего, мне не нужного.

Недавно заметил, что при большом количестве обращений эта функция довольно медленная и ресурсоемкая.
Как положено, полез на http://www.php.net/get_browser читать, что пишут в комментариях.

Первое, что попробовал, перейти на облегченную версию browscap.ini...
Помогло... процентов на 5 frown.gif
В коментах нашел Browser Capabilities PHP Project. По заявлениям автора одни из основных фитч
- быстрота и полная совместимость с get_browser().

Мне так-же понравилось автоматическое обновление browscap.ini.

С совместимостью оказалось не все гладко. Если у get_browser() все свойства написаны строчными,
то у данного проекта их названия пишутся с большой буквы,
следовательно совместимость не полная. Но, это не самая большая проблема и легко обходится.

Но вот со скоростью всплыли неожиданные проблемы.
Даже после накопления кеша производительность не увеличилась и осталась на уровне get_browser()

Для себя решил эту проблему след. образом:

таблица в mysql:

CREATE TABLE `bc_cache` (
  `cache_id` bigint(16) unsigned NOT NULL auto_increment,
  `hash` char(32) NOT NULL default '',
  `browser` char(32) NOT NULL default '',
  `version` char(32) NOT NULL default '',
  `platform` char(32) NOT NULL default '',
  PRIMARY KEY  (`cache_id`),
  UNIQUE KEY `hash` (`hash`)
)

Код в PHP примерно такой:

$ua_hash = bin2hex(mhash(MHASH_MD5,$_SERVER['HTTP_USER_AGENT']));
$query = sprintf("select browser,version,platform from bc_cache where hash='%s'",$ua_hash);
$data = mysql_query($query,$res);
if (mysql_num_rows($data)) {
    $browser = mysql_result($data,0,'browser');
    $version = mysql_result($data,0,'version');
    $platform = mysql_result($data,0,'platform');
} else {
    $bc = get_browser($useragent);
    $browser = $bc->browser;
    $version = $bc->version;
    $platform = $bc->platform;
    $query = sprintf("insert into bc_cache (hash,browser,version,platform) values ('%s','%s','%s','%s')",
                        $ua_hash,
                        $browser,
                        $version,
                        $platform);
    mysql_unbuffered_query($query);
}

В дальнейшем пользуюсь переменными $browser,$version и $platform как мне заблагорассудится.

Результат - повышение производительности, на глаз, раза в 4-8.

Почему? За счет того, что $_SERVER['HTTP_USER_AGENT'] хоть и может сильно различаться,
но всё-таки, вещь не самая уникальная. А select по уникальному индексу по char(32) отрабатывает очень быстро!


URL: http://bb.ct.kz/index.php?automodule=blog&blogid=3&showentry...
Обсуждается: http://www.opennet.ru/tips/info/1371.shtml

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру