Разрешенный объем памяти исчерпан в Browscap
Я скачал библиотеку browscap версии 2.0 и добавил этот код
$browscap = new Browscap('/tmp');
$browscap->doAutoUpdate = false;
$current_browser = $browscap->getBrowser();
Проблема в том, что когда я пытаюсь получить информацию о текущем браузере, у меня появляется ошибка
Разрешенный объем памяти 268435456 байт исчерпан (попытался выделить 281 байт) в....phpbrowscap-2.0/src/phpbrowscap/Browscap.php в строке 677
Я не хочу увеличивать объем памяти, потому что буду терять производительность, поскольку мой код выполняется на каждой странице загрузки. Поэтому я попытался отладить код и заметил, что он проверяет множество браузеров. В $tmp_user_agents много значений, и он зацикливается на этой переменной.
Есть ли способ получить функциональность этой библиотеки, не занимая слишком много времени? Или я что-то упустил в том, как это работает
2 ответа
Хорошо, у Browscap есть очень очень большая база данных, и загружать ее (и повторять по ней) при КАЖДОМ одностраничном обращении, конечно, не очень эффективно. Файл "INI", который я скачал на их сайте, имеет 7,5 МБ!!! То, что PHP не хватает памяти, легко понять. Я не рекомендовал бы использовать эту библиотеку в этом случае.
Я только проверил их веб-сайт и файл ресурсов - не код - но кажется, что они только ищут строку User-Agent для проверки браузера (что, кстати, очень легко подделать).
Вы когда-нибудь смотрели на эту функцию PHP: http://php.net/manual/de/function.get-browser.php Достаточно вывода для ваших нужд?
Я знаю, что это немного поздно для вечеринки, но самый эффективный способ его использования - запускать на вашем сервере задание cron один раз в день, чтобы обновлять кеш, а затем в вашем коде сделать так, чтобы оно обновляло кеш при вызове browscap,
На страницах вашего сайта запустите этот код:
$browscap = new Browscap($cacheDir);
$browscap->doAutoUpdate = false;
$current_browser = $browscap->getBrowser();
На вашем сервере создайте этот скрипт (я назвал его updateBrowscap.php), мой находится в той же папке, что и browscap.php, а папка кеша является его подпапкой.
ini_set('memory_limit','1024M'); // allow 1GB for this script
set_time_limit(300); // change to 5 minutes for this script
// CREATE THIS CRON SCRIPT TO RUN ONCE PER DAY
// /usr/bin/php -q [full-path-to-this-file]/updateBrowscap.php > [full-path-to-this-file]/backup.log 2>&1
// Loads the class
require 'Browscap.php';
// The Browscap class is in the phpbrowscap namespace, so import it
use phpbrowscap\Browscap;
echo 'started: '.date("d-m-Y H:i:s", time()).PHP_EOL;
$path = dirname(__FILE__).'/cache';
$bc = new Browscap($path);
$bc->updateCache();
echo 'finished: '.date("d-m-Y H:i:s", time()).PHP_EOL;
Мой сценарий не будет работать с использованием максимальных 512 МБ, которые разделяемый хост позволит мне выделить, поэтому я вручную установил в этом сценарии значение 1024 МБ.
Как только я решил проблему с памятью, у меня возникла проблема с тайм-аутом, поэтому я увеличил ее с 30 секунд до 5 минут только для этого сценария.
Я бегаю один раз в день около 3 часов ночи.