Разрешенный объем памяти исчерпан в 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 часов ночи.

Другие вопросы по тегам