2014-07-15 123 views
0

我已經下載了庫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中有很多值,他正在循環這個變量。

反正有沒有花費太多時間來獲得這個圖書館的功能?或者我錯過了它的工作原理

回答

0

那麼Browscap有一個非常非常龐大的數據庫,並且在每個單頁上加載(並遍歷它)當然不是很有效。我在他們的網站上下載的「ini」文件有7.5MB! PHP內存不足很容易理解。在這種情況下,我不會推薦使用這個庫。

我只檢查了他們的網站和資源文件 - 而不是代碼 - 但它好像他們只是尋找用戶代理字符串來驗證瀏覽器(這很容易被假冒)。

你有沒有看過這個PHP函數:http://php.net/manual/de/function.get-browser.php 足夠的輸出爲您的需求?

+0

我只想知道瀏覽器是否能夠接受cookies,但是我需要對php.ini進行更改,但我無法訪問 – beginner1

+0

您可以嘗試'ini_set()'或像這樣:http://stackoverflow.com/questions/9448424/detect-if-cookies-are-enabled-in-php –

+0

'browscap'只能在系統php.ini和/或httpd.conf中更改。我無法在腳本級別設置它。至於你的其他建議,我想避免頁面重新加載,但我想我沒有其他選擇。 – beginner1

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點左右運行一次。