允许的内存大小在Browscap中耗尽

时间:2014-07-15 10:12:48

标签: php browscap

我已经下载了browscap 2.0版库并添加了此代码

$browscap = new Browscap('/tmp');
$browscap->doAutoUpdate = false;
$current_browser = $browscap->getBrowser();

问题在于,当我尝试获取有关当前浏览器的信息时,我会发生错误

  

允许内存大小268435456个字节耗尽(试图分配281个字节)....在第677行的phpbrowscap-2.0 / src / phpbrowscap / Browscap.php

我不想增加内存,因为我的代码会在每个加载页面上执行,因此我会失去性能。 所以我尝试调试代码,我注意到他正在检查很多浏览器。 $ tmp_user_agents中有很多值,他循环遍历此变量。

无论如何都可以在不花太多时间的情况下获得此库的功能吗?或者我错过了它的工作原理

2 个答案:

答案 0 :(得分:0)

Browscap有一个非常庞大的数据库,并且在每个单页命中加载(并迭代它)当然不是非常有效。 " ini"我在他们网站上下载的文件有7.5MB! PHP的内存耗尽很容易理解。在这种情况下,我不建议使用此库。

我只检查了他们的网站和资源文件 - 而不是代码 - 但似乎他们只是查找用户代理字符串来验证浏览器(顺便说一下这很容易伪造)。

你有没有看过这个PHP函数:http://php.net/manual/de/function.get-browser.php 足够的输出满足您的需求?

答案 1 :(得分:0)

我知道派对有点晚了,但最有效的方法就是每天在服务器上运行一次cron作业来更新缓存,然后在你的代码中使它更好地更新缓存时叫做browscap。

在您的网站页面中,运行以下代码:

$browscap = new Browscap($cacheDir);
$browscap->doAutoUpdate = false;
$current_browser = $browscap->getBrowser();

在你的服务器上,创建这个脚本(我称之为updateBrowscap.php),我的文件夹与browscap.php在同一个文件夹中,而cache文件夹是它的子文件夹。

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;

我的脚本不会使用共享主机允许我分配的最大512MB运行,因此我已在此脚本中手动将其设置为1024MB。

一旦我解决了内存问题,我就遇到了超时问题,所以我将这个脚本从30秒增加到5分钟。

我每天凌晨3点左右跑一次。