2014-04-11 51 views
2

我們在PHP中使用get_browser(),使用php_browscap.ini,但性能非常糟糕。我們將100個左右的用戶代理傳遞給每個頁面get_browser(),並且需要30多秒來渲染頁面。我們需要一個高性能的解決方案,而不會永久存儲實際的結果(我們只想存儲用戶代理)。提高php get_browser()性能

我們已經使用了memcached,有沒有辦法改變get_browser()來緩存結果,或者將整個php_browscap.ini加載到memcached中。

回答

2

端了滾動我們自己的解決方案:

//// 
    // This function caches in memcached. 
    //// 
    public static function get_browser_memcached($user_agent) { 
     if(empty(MemcacheConnection::$memcache_connection)) { 
      MemcacheConnection::connect(); 
     } 

     $memcache_key = preg_replace('/\s+/', '', sha1($user_agent)) . "_user_agent"; 
     $memcache_result = MemcacheConnection::get($memcache_key); 

     if($memcache_result !== false) { 
      return $memcache_result; 
     } 

     $browser = get_browser($user_agent); 

     //Store in Memcached (cached for 7 days) 
     MemcacheConnection::set($memcache_key, $browser, 604800); 
     return $browser; 
    } 
+0

這裏你的緩存命中率是多少?很難說瀏覽器有多獨特,因此這種方法有多麼值得... –

0

我知道我在一個小報時晚,但它的價值,我使用的browscap-php庫(由@AbcAeffchen提到)在我的一個項目中,我很高興到目前爲止。

一個典型的查找(從我自己的簡單的度量)在一個1核心512MB雲實例(這幾乎是您可以在任何地方找到的最小值)大約需要20到30ms。我選擇使用Redis緩存,這將查找時間縮短到幾毫秒......所以如果您真的需要,可以進行優化。

只有便利性使它值得一試。