0

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

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

问题是当我试图获取有关当前浏览器的信息时,我会遇到错误

第 677 行 ....phpbrowscap-2.0/src/phpbrowscap/Browscap.php 中允许的内存大小为 268435456 字节已用尽(尝试分配 281 字节)

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

有没有办法在不花太多时间的情况下获得这个库的功能?还是我在它的工作方式上遗漏了什么

4

2 回答 2

0

好吧,Browscap 有一个非常非常大的数据库,并且在每一个页面点击时加载(并迭代它)当然不是很有效。我在他们网站上下载的“ini”文件有 7.5MB!!!PHP 内存不足很容易理解。在这种情况下,我不建议使用这个库。

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

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

于 2014-07-15T13:44:46.657 回答
0

我知道这对聚会来说有点晚了,但是使用它的最有效方法是每天在您的服务器上运行一次 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;

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

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

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

于 2015-06-25T20:13:49.347 回答