php擴展memcached
❶ 使用php Memcache模塊如何正確遍歷所有KEY以及VALUE
在php提供的用於與memcached交互的擴展模塊中有memcached與memcache,前者提供方法getAllKeys用於遍歷所有Memcached伺服器上的key,但是並不保證原子操作,而後者卻沒有提供任何方法,雖然在PHP官方
文檔中有人給出使用方法getExtendedStats來間接獲取Memcached伺服器上的所有key,但是給出的代碼是有不少坑的,如果拿來就用,對於cluster的memcached伺服器而言,有些問題就需要指出來。
下面將給出官方文檔中的代碼,並指出可能面臨的問題,代碼如下:
<?php
/**
*Functiontogetallmemcachekeys
*@authorManishPatel
*@Created:28-May-2010
*/
functiongetMemcacheKeys(){
$memcache=newMemcache;
$memcache->connect('127.0.0.1',11211)ordie("");
$list=array();
$allSlabs=$memcache->getExtendedStats('slabs');
$items=$memcache->getExtendedStats('items');
foreach($allSlabsas$server=>$slabs){
foreach($slabsAS$slabId=>$slabMeta){
$cmp=$memcache->getExtendedStats('cachemp',(int)$slabId);
foreach($cmpAS$keys=>$arrVal){
foreach($arrValAS$k=>$v){
echo$k."<br>";
}
}
}
}//EOgetMemcacheKeys()?>
在上述代碼中,如果用於獲取單個memcached伺服器上的key,是不存在任何問題,但是獲取連接池中的多個memcached所有key就存在問題,會發現列印出重復的key,問題就在於當使用getExtendedStats用去特定$slabID
上的信息時,返回的是連接池中所有的伺服器上的特定$slabId的存儲的keys信息。當$server為"127.0.0.1:11214"且$slabId為0將變數$cmp的信息列印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}
當$server為"127.0.0.1:11216"且$slabId為0將變數$cmp的信息列印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}
❷ usememcachedandphp-memcache(d)
針對 memcached 版本從1.2升級至1.3,刪除操作協議發生變化。而 memcached 1.4版本中,錯誤的格式會導致致命錯誤:失敗,錯誤信息為「CLIENT_ERROR bad command line format」。因此,使用php pecl-memcache時,在新版本中會遇到問題。
對於php pecl-memcached,由於它使用的是libmemcache,所以不存在上述問題。為了在代碼中選擇使用哪個memcache擴展,我們編寫了一個函數:
$mem_flag = 0;$mem_conn = null;function mcached_conn(){global $config, $mem_flag, $mem_conn;if($mem_flag != 1){if ($config['mcache']['version']==0){$mem_conn = memcache_pconnect($config['mcache']['host'], 11211);} else {$mem_conn = new Memcached();$mem_conn->addServer($config['mcache']['host'], 11211);}$mem_flag = 1;}return $mem_conn;}
在需要設置、獲取或刪除緩存時,通過memcache_version_set()、memcache_version_get()和memcache_version_del()函數,根據配置中的mcache版本信息,選擇使用memcache或Memcached。
使用memcache_version_set()函數時,如果配置的mcache版本為0,則調用memcache_set()方法;否則,使用Memcached對象的set()方法。
memcache_version_get()函數同樣遵循類似邏輯,選擇memcache_get()或Memcached對象的get()方法獲取緩存值。
memcache_version_del()函數用於刪除緩存,根據配置版本選擇memcache_delete()或Memcached對象的delete()方法執行刪除操作。
通過這個設計,程序能夠智能地根據memcache的版本選擇合適的緩存擴展,避免了版本差異帶來的問題。
❸ php 怎麼配置memcached
分為linux和windows系統下:
windows下:
1、首先下載memcache的windows版本,將下載下來的文件解壓出來後會看見一個名為memcached.exe的可執行程序
2、將該文件放到指定目錄,如D盤
3、安裝:
開始->運行->cmd打開命令窗口
進入D盤:cd d:
安裝memcache服務:
在命令窗口輸入:
memacahed.exe -d install
等待命令執行完成後,就可以在服務列表中看到memcached服務
4、啟動memcache服務:
memcached.exe -d start
5、可以通過以下命令來查看memcache服務是否啟動成功:
wmic process get description, executablepath | findstr memcached.exe
可以將memcached.exe的路徑放入到系統環境變數中,方便使用。
查看memcache運行狀態:
在命令窗口輸入:
telnet 127.0.0.1 11211
鏈接到memcache上,輸入stats就可以查看到當前memcache的狀態了;
linux下:
1.下載memcache源碼
http://www.memcached.org/
2.解壓並進入目錄
./configure --prefix=/usr/local/memcache
make
make test
sudo make install
3.啟動memcache
memcache -d start -u root
驗證memcache是否正確安裝並啟動
netstat -tap | grep memcached
4.安裝memcache擴展庫
下載memcache擴展
進入到memcache擴展文件
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
make
make install
修改php.ini文件 增加
extension=memcache.so
安裝memcached擴展庫
下載memcached擴展
memcached擴展需要libMemcached庫的支持,所有在安裝memcached擴展庫之前要確認系統已經安裝了libmemcached
安裝libmemcached
./configure --prefix=/usr/local/memcache
make
make install
libmemcached安裝完成後,就可以安裝memcached擴展庫
./configure --with-libmemcached-dir=/usr/local/memcached/ --with-php-config=/usr/local/php/bin/php-config
make
make install
同樣修改php.ini配置文件,增加
extension=memcached.so
❹ PHP中4個加速,緩存擴展的區別和選用建議
1、eAccelerator
eAccelerator是一個自由開放源碼PHP加速器,優化和動態內容緩存,提高了PHP腳本的緩存性能,使得PHP腳本在編譯的狀態下,對伺服器的開銷幾乎完全消除。 它還有對腳本起優化作用,以加快其執行效率。使PHP程序代碼執效率能提高1-10倍。從文字上可以理解為:eAccelerator是PHP加速器擴展。
2、memcached
Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提供動態、資料庫驅動網站的速度。從文字上可以理解為:內存緩存擴展,並且針對於集群伺服器使用較多,主要用於分布式緩存,算是資料庫緩存。
3、Alternative PHP Cache(APC緩存)
Alternative PHP Cache (APC緩存)是一種對PHP有效的開放源高速緩沖儲存器工具,他能夠緩存Opcode(目標文件)的PHP中間碼。 APC的緩存分兩部分:系統緩存和用戶數據緩存. 系統緩存 是自動使用的,是指APC把PHP文件源碼的編譯結果緩存起來,然後在再次調用時先對比時間標記。如果未過期,則使用緩存代碼運行。默認緩存 3600s(一小時).但是這樣仍會浪費大量CPU時間.因此可以在php.ini中設置system緩存為永不過期(apc.ttl=0).不過如果這樣設置,改運PHP代碼後需要restart一下您的web伺服器(比如apache…).目前對APC的性能測試一般指的是這一層cache;從文字上理到:Alternative PHP Cache(APC緩存)也算是一種內存緩存擴展,算是資料庫緩存擴展。
4、Xcache
是一個開源的opcode緩存器/優化器, 他能夠提高伺服器上的PHP性能,他通過把編譯PHP後的數據緩沖到共享內存從而避免重復的編譯過程, 能夠直接使用緩沖區已編譯的代碼從而提高速度. 通常能夠提高您的頁面生成速率2到5倍, 降低伺服器負載。 其實它與eAccelerator一樣是PHP加速器擴展。
以上就是他們的作用與區別,簡單一點就是:eAccelerator,xcache是PHP緩存擴展,memcached、APC緩存是資料庫緩存擴展,一般兩者只有要安裝其中一個即可,不要貪多。另外,實際測試中發現當Cache數量超過一定閥值的時候,APC的性能不如Memcache。所以在擴展的選擇上,本人一般會選擇xcache+memcached這個組合。