Retox
Цель точно определять имя браузера.
Выбрал базу - browscap.ini размер:13Mb
Проблема: Время работы скрипта парсящего базу слишком долгое - 23.2953 сек.
Или всё дело в слабом сервере?
Atom (Intel Atom 330 1.6GHz Dual Core, 1Gb RAM, 250Gb SATA HDD, 100Mbps port, 6000Gb bandwidth)
Может есть возможность ускорить работу скрипта? Потому что, SxGeo с 14 Gb GEO базой отрабатывает шустро, а данный скрипт очень медленно.
Подскажите в какую сторону смотреть - может утечка времени в скрипте парсинга базы или как то закешировать базу можно или ещё как ускорить?
Скрипты:
http://alexandre.alapetite.fr/doc-alex/php-local-browscap/
Скрипт с подключённым файла парсинга базы.
<?php
if (get_cfg_var('browscap'))
$browser=get_browser(); //If available, use PHP native function
else
{
require_once('php-local-browscap.php');
$browser=get_browser_local();
}
print_r($browser);
?>
php-local-browscap.php сам код парсинга браузера, в зависимости от юзер агента:
<?php
$browscapIni=null; //Cache
$browscapPath=''; //Cached database
function _sortBrowscap($a,$b)
{
$sa=strlen($a);
$sb=strlen($b);
if ($sa>$sb) return -1;
elseif ($sa<$sb) return 1;
else return strcasecmp($a,$b);
}
function _lowerBrowscap($r) {return array_change_key_case($r,CASE_LOWER);}
function get_browser_local($user_agent=null,$return_array=false,$db='./browscap.ini',$cache=false)
{//http://alexandre.alapetite.fr/doc-alex/php-local-browscap/
//Get php_browscap.ini on
http://browsers.garykeith.com/downloads.asp
if (($user_agent==null)&&isset($_SERVER['HTTP_USER_AGENT'])) $user_agent=$_SERVER['HTTP_USER_AGENT'];
global $browscapIni;
global $browscapPath;
if ((!isset($browscapIni))||(!$cache)||($browscapPath!==$db))
{
$browscapIni=defined('INI_SCANNER_RAW') ? parse_ini_file($db,true,INI_SCANNER_RAW) : parse_ini_file($db,true);
$browscapPath=$db;
uksort($browscapIni,'_sortBrowscap');
$browscapIni=array_map('_lowerBrowscap',$browscapIni);
}
$cap=null;
foreach ($browscapIni as $key=>$value)
{
if (($key!='*')&&(!array_key_exists('parent',$value))) continue;
$keyEreg='^'.str_replace(
array('\\','.','?','*','^','$','[',']','|','(',')','+','{','}','%'),
array('\\\\','\\.','.','.*','\\^','\\$','\\[','\\]','\\|','\\(','\\)','\\+','\\{','\\}','\\%'),
$key).'$';
if (preg_match('%'.$keyEreg.'%i',$user_agent))
{
$cap=array('browser_name_regex'=>strtolower($keyEreg),'browser_name_pattern'=>$key)+$value;
$maxDeep=8;
while (array_key_exists('parent',$value)&&array_key_exists($parent=$value['parent'],$browscapIni)&&(--$maxDeep>0))
$cap+=($value=$browscapIni[$parent]);
break;
}
}
if (!$cache) $browscapIni=null;
return $return_array ? $cap : (object)$cap;
}