【问题标题】:Allowed Memory size exhausted in BrowscapBrowscap 中允许的内存大小已用尽
【发布时间】:2014-09-05 11:45:45
【问题描述】:

我已经下载了库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 中有很多值,他正在循环这个变量。

有没有办法在不花太多时间的情况下获得这个库的功能?还是我错过了它的工作原理

【问题讨论】:

    标签: php browscap


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我只是想知道浏览器是否能够接受 cookie,但是这个功能的问题是我需要对我无权访问的 php.ini 进行更改
      • 你可以试试ini_set()或类似的东西:stackoverflow.com/questions/9448424/…
      • 'browscap' 只能在系统 php.ini 和/或 httpd.conf 中更改。我无法在脚本级别设置它。至于你的其他建议,我想避免重新加载页面,但我想我别无选择。
      • 您可以使用 JavaScript 来验证该功能。这不会导致重新加载并由客户端执行。但当然它不是很安全,因为人们可以禁用 JavaScript。但是您可以使用 JavaScript 进行验证,如果这不起作用,您可以尝试 php reload-thing。因此,对于大多数用户而言,您的脚本可以正常工作,而那些“超级安全”的非 JavaScript-Freaks 需要与重新加载相处。
      猜你喜欢
      • 2013-02-08
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多