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 がメモリ不足になるということは、簡単に理解できます。この場合、このライブラリを使用することはお勧めしません。

コードではなく、彼らのウェブサイトとリソースファイルのみをチェックしましたが、ブラウザを検証するために User-Agent String だけを探しているようです (ちなみに、これは非常に簡単に偽造できます)。

この PHP 関数を見たことがありますか? http://php.net/manual/de/function.get-browser.php 必要な出力は十分ですか?

于 2014-07-15T13:44:46.657 に答える
0

私はこれがパーティーに少し遅れていることを知っていますが、それを使用する最も効率的な方法は、サーバーで1日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 分に増やしました。

1日1回、午前3時頃に実行しています。

于 2015-06-25T20:13:49.347 に答える