首頁  >  文章  >  後端開發  >  php操作memcache的單例模式並測試其機制

php操作memcache的單例模式並測試其機制

WBOY
WBOY原創
2016-07-29 09:08:511656瀏覽

    
    private static $instance = null;
    private static $host = '127.0.0.1
    public static function getInstance()
    {
        if (!(self::$instance instanceof Memcached)) {
            self::$instance = new Memcached();
          }
        return self::$instance;
    }
}
ini_set('memory_limit','1024M');//這裡要注意,當前頁的最大使用記憶體max_execution_time',60);   //php頁面的最大執行時間,這裡預設值是30s,如果超過也需要重新設定
$mcache = MemcacheOpr::getInstance();//單例模式呼叫
$mcache->flush$mcache->flush ();               //先完全清除
$mcache->delete('string1m');
$mcache->delete('string2m');
$mcache-delete); ('string4m');
$mcache->delete('string5m');
for($i=0;$i    $mcache->delete('string'.$i );
}
/*$mcache->set('somewords','have you learned some thing?');
$output = $mcache->get('somewords');
echo "output=[$output ]
";*/
$begintime = microtime(TRUE);
$input = str_repeat('what',1024*1024*16*2*1.5);  //192M
$input = substr($input ,0,-512);
$mcache->set('string1m',$input);//192M 為什麼存入192M的5條內容都能成功呢?是因為memcached對存入記憶體的東西開啟了壓縮
$mcache->set('string2m',$input.'areyou2');
$mcache->set('string3m',$input.'areyou3');
$mcache->set('string4m',$input.'areyou4');
$mcache->set('string5m',$input.'areyou5');
/*for($i=0;$i     $mcache->set('string'.$i, $input);
}*/
$input = str_repeat('what',1048576); //這裡實際上存入了4M的東西,因為memcached開啟了壓縮,所以實際存入的內容很少才會沒問題。
for($i=0;$i    $mcache->set('string'.$i,$input);
}
$mcache->delete('somewords') ;
$during = microtime(TRUE) - $begintime;
echo 'total time:'.$during.'s
';
file_put_contents('/tmp/string5m.log',$mcache->get( 'string1m'));
//echo 'length of $output is:'.strlen($output).",output=[$output]
";
/*$allKeys = $mcache->getAllKeys ();
var_dump($allKeys);

print_r($mcache->getStats());*/




其實從phpinfo()中我們可以看到針對保存內容超過2000字節的內容, memcached會開啟壓縮

針對php數組,memcache會序列化,所以保存的內容長度可以跟實際內容長度不相同。

php操作memcache的單例模式並測試其機制如果想看伺服器上的memcache使用狀態,可以透過telnet 127.0.0.1 11211指令來查看

取得實際儲存的值: get string1m

透過stats指令來顯示其中的一些狀態,例如記憶體命中

透過stats slabs 來顯示不同的slab塊的實際情況

實際上默認每頁(page)保存1m的內容,然後這1m的內容可以按照chunksize的大小等分成很多塊,這些塊就是slab塊

當儲存的內容長度相同時,一般會使用相同大小的區塊,超過該長度1.25倍(預設的遞增倍數)的時候,會啟用新的slab區塊。


遞增倍數越大,內存浪費的越厲害,如果8k的slab塊已經用完了,你又想繼續保存8k的數據,那就會使用10k的數據(默認情況下),實際上已經浪費了2k的記憶體資料了;

如果遞增倍數為2,那將浪費8k的記憶體。

以上就介紹了php操作memcache的單例模式並測試其機制,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn