Улучшение производительности php get_browser()
Мы используем get_browser()
в PHP используя php_browscap.ini
но производительность ужасна. Мы передаем около 100 пользовательских агентов в get_browser()
на страницу, и рендеринг страницы занимает более 30 секунд. Нам нужно качественное решение без сохранения фактического get_browser()
результаты постоянно (мы хотим хранить только пользовательские агенты).
Мы уже используем memcached, есть ли способ, которым мы можем изменить get_browser()
для кэширования результатов или загрузки всего php_browscap.ini
в memcached.
3 ответа
Закончилось сворачивание нашего собственного решения:
////
// This function caches in memcached.
////
public static function get_browser_memcached($user_agent) {
if(empty(MemcacheConnection::$memcache_connection)) {
MemcacheConnection::connect();
}
$memcache_key = preg_replace('/\s+/', '', sha1($user_agent)) . "_user_agent";
$memcache_result = MemcacheConnection::get($memcache_key);
if($memcache_result !== false) {
return $memcache_result;
}
$browser = get_browser($user_agent);
//Store in Memcached (cached for 7 days)
MemcacheConnection::set($memcache_key, $browser, 604800);
return $browser;
}
Я не использовал библиотеку browscap-php, но я настоятельно рекомендую использовать проект Browser Capabilities Project. http://browscap.org/
Библиотека на GitHub должна улучшить производительность.
Я знаю, что перезвоню немного позже, но для чего бы то ни было, я использую библиотеку browscap-php (как упомянуто @AbcAeffchen) в одном из моих проектов, и я счастлив до сих пор.
Типичный поиск (по моим собственным простым измерениям) занимает около 20~30 мс на 1-ядерном 512 МБ облачном экземпляре (что в значительной степени является минимумом, который вы можете найти где угодно). Я решил кешировать с помощью Redis, и это сокращает время поиска до пары мс... так что можно оптимизировать, если вам действительно нужно.
Одно только удобство делает это попыткой.