Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Вопрос на счёт ускорения работы с browscap.ini
цитата
03/06/15 в 02:21
 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;
}
цитата
03/06/15 в 09:27
 freeek
Нужно распарсить Useragents на ПХП

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


Эта страница в полной версии