В PHP есть очень удобная для разного рода стат. машин функция - get_browser(). Она возвращает по юзерагенту объект, содержащий отфильтрованный набор информации о браузере и его системе, как то имя, платформа, версия и т.п. "Т.п." - это набор информации, о поддержке кук, дотнета и еще кучи всего, мне не нужного.
Недавно заметил, что при большом количестве обращений эта функция довольно медленная и ресурсоемкая. Как положено, полез на http://www.php.net/get_browser читать, что пишут в комментариях.
Первое, что попробовал, перейти на облегченную версию browscap.ini... Помогло... процентов на 5
В коментах нашел Browser Capabilities PHP Project. По заявлениям автора одни из основных фитч - быстрота и полная совместимость с get_browser().
Мне так-же понравилось автоматическое обновление browscap.ini.
С совместимостью вышел прокольчик Если у get_browser() все свойства написаны строчными, то у данного проекта их названия пишутся с большой буквы, следовательно совместимость не полная. Но, это не самая большая проблема и легко обходится.
Но вот со скоростью вышел нежданчик... Даже после накопления кеша производительность не увеличилась и осталась на уровне get_browser()
Для себя решил эту проблему след. образом:
таблица в mysql:
Результат - повышение производительности, на глаз, раза в 4-8.
Почему? За счет того, что $_SERVER['HTTP_USER_AGENT'] хоть и может сильно различаться, но всё-таки, вещь не самая уникальная. А select по уникальному индексу по char(32) отрабатывает очень быстро!
Недавно заметил, что при большом количестве обращений эта функция довольно медленная и ресурсоемкая. Как положено, полез на http://www.php.net/get_browser читать, что пишут в комментариях.
Первое, что попробовал, перейти на облегченную версию browscap.ini... Помогло... процентов на 5
В коментах нашел 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) отрабатывает очень быстро!