使用Memcache在PHP中調試方法的介紹及應用
如果我們在網絡開發中,特別是大訪問數據的速度查詢運算,那我們都會選到memcahce。首先我們必須安裝,接下來如何使用memcache,在這裡介紹下在linux下安裝和windows、 Memcache
安裝:1.下載memcache
的linuxmemcache的? event 來做事件驅動,所以先安裝有libevent。 2. 安裝 pecl::memcache。
用
pecl 命令列工具安裝:pecl install memcache
或直接從原始碼安裝
二、Windows下的
Memcache
安裝:
1.
下載
memcache
的
windowsmemcache的windows版2. 在終端機(也是
cmd指令介面)下輸入 'c:memcachedmemcached.exe -d install' start ' 啟動。 NOTE: 以後
memcached將作為windows的一個服務每次開機時自動啟動。這樣伺服器端已經安裝完畢了。 4.下載
http://pecl4win.php.net/ext.php/php_memcache.dll,請自己找對應的php C:winntphp.ini 加入一行 'extension=php_memcache.dll'6. memcache
,那就表示安裝成功吧! 三、memcached的基本設定:-p 監聽的連接埠
-l 連接的?機-d start 啟動memcached
服務
-d restart 重起memcached服務 服務-d install 安裝
memcached服務
-d uninstall
卸載memcached
root運作的時候有效 )-m 最大記憶體使用,單位
MB
。預設64MB-M
記憶體耗盡時回傳錯誤,而不是刪除項目
-c 最大同時連結數,預設是1024
1.25-n 最小分配空間,key+value+flags預設是
48-h 48
-h : [Memcache]
一個高效能的分散式的記憶體物件快取系統,透過在記憶體中維護一個統一的巨大的hash表,它能夠用來儲存各種格式的數據,包括圖像、視訊、檔案以及資料庫檢索的結果等。
是否在遇到錯誤時透明地向其他伺服器進行故障轉移。
memcache.allow_failover = On
接受並發送資料時最多嘗試多少伺服器,只在開啟memcache.allow_failover時有效。 memcache.max_failover_attempts = 20
資料將依照此值設定的區塊大小進行轉移。此值越小所需的額外網路傳輸越多。如果發現無法解釋的速度降低,可以嘗試將此值增加到32768。
memcache.chunk_size = 8192
連接到memcached伺服器時使用的預設TCP連接埠。
memcache.default_port = 11211
控制將key對應到server的策略。預設值"standard"表示使用先前版本的老hash策略。
設為"consistent"可以允許在連接池中新增/刪除伺服器時不必重新計算key與映射刪除伺服器時不必重新計算key
memcache.hash_strategy = "standard";
控制將
key對應到server的雜湊函數。預設值"crc32"使用CRC32演算法,而"fnv"則表示使用FNV-1afnv"則表示使用FNV-1a1a演算法。 FNV-1a比CRC32速度稍低,但散列效果較好。
memcache.hash_function = "crc32"
memcache也可以作為session session.save_handler. 1 . $memcache = new Memcache; 2. $memcache->connect('localhost', 11211) or ("Could not connect); 4. $version = $memcache->getVersion( );
5. echo "Server's version: ".$version."
n";
8. $tmp_object->str_attr = 'test' ;
9. $tmp_object->int_attr = 123;
10. 🟎 ) or die ("Failed to save data at the server" );
12. echo "Store data in the cache (data will expire in 10 seconds)
get('key');
15. echo "Data from the cache:
n";
16.
17. 16.
17. var_dump(
,現在接下來如何調試
memcache.
來做個測試。
先搞個表:
create table t(id char(36) not null primary key, username varchar(20) not null);點資料🎠. s (uuid(),' Livia'),(uuid(),'Lucy'),(uuid(),'Sivia'),(uuid(),'david');
寫一個簡單腳本測試一下。
$主機= '192.168.1.21:3306';
$user = 'webuser';
$passwd = '123456';
sql_$db user,$passwd);
mysql_select_db($db,$conn);
$sql = '按id desc 從t 訂單選擇*';
$ while ($row = mysql_fetch_array($result,MYSQL_ASSOC)){
$test_key[] = $row;
}
$sql = md5($mache); mem->connect("192.168.1.21", 11211);
$mem->set($sql,$test_key, MEMCACHE_COMPRESSED, 600);
sql
print_r($mem-get($
sql); ? >
看看結果出來了。
C:>php -f "d:/lamp/web2/phpinfo.php"
Array
(
[0] => Arrayoo 1dd- bd1a-002215c94322
[使用者名稱] => 大衛
)
[1] => 數組
(
[19-1931] 002215c94322
[使用者名稱] => 西維亞
)
[2] => 數組
(
[id] => d8f1ea 9a-c033-1111-bd1a-1 d8f1ea 9a-c033-111-bd1a-150
)
[3] => 數組
(
[id] => d8f1e658-c033-11dd-bd1a-002215c9第4322章Livia
mcache
安裝,不再贅述。再次引入
memcache
的一些常用方法。
Memcache::add //
加上一個值,如果已經存在,則回傳
false
Memcache::addServer //
關閉一個
Memcache
的連線
記憶體快取: :connect // 開啟一個到Memcache 中的值進行減法操作
Memcache::delete // 刪除一個Memcache
上的
上已儲存的項目(相當於刪除所有已儲存的項目) Memcache::get //
從
Memcache上取得一個key中所有程序的運作系統統計
Memcache::getServerStatus / / 取得運作伺服器的參數Memcache::getStats // // 回傳運作的
Memcache的版本資訊 Memcache::increment // 對儲存的某個
打開一個到
Memcache的長連接Memcache ::replace // 替換一個已經存在Meache
::set //
為Memcache加值,如果已經存在,則覆寫
Memcache::setCompressThreshold //
對壓縮單一大小的資料進行壓縮大小的資料進行壓縮/ 在運作時修改伺服器的參數下面是一些簡單的實例,初學者參考: $mem = new Meache; 12000); //Memcache::set方法有四個參數,第一個參數是key
,第二個參數是value,第三個參數可選,表示是否壓縮保存,第四個參數可選,用來設定一個過期自動銷毀的時間。
$mem->set('test','123',0,60);
//Memcache::add方法的作用和::Meache::set) 如果區別,區別Memcache::add方法的回傳值為false,表示這個key已經存在,而Megache::set已經存在,而Megache::set
寫。
$mem->add('test','123',0,60);//Memcache::get方法的作用是取得一個key值,方法的作用是取得一個key值,
方法有一個參數,表示
key。
$mem->get('test');//輸出為'123'//Memcache::replace 方法的作用是對一個已有的//Memcache::replace 方法的作用是對一個已有的寫入操作,Memcache::replace
方法有四個參數,作用和
Memcache::set
方法的相同。 $mem->replace('test','456',0,60); //Memcache::delete方法的作用是刪除一個keyache 方法有兩個參數,第一個參數表示key
,第二個參數可選,表示刪除延遲的時間。
$mem->delete('test',60);
?>
肖承湖
PHP緩存應用:PHP MEMCACHE 詳解
2010-01-28 09:38:44 來源:中國站長站綜合 【大 中 小】 評論:0 條 我要投稿 收藏本文 分享至微博
站長交易(http://jy.chinaz.com)幫站長賺錢 虛擬主機評測+IDC導航=IDC123.COM
Memcache函數庫是在PECL(PHP Extension Community Library)中,主要作用是搭建大容量的記憶體資料的臨時存放區域,在分佈式的時候作用體現的非常明顯,否則不建議使用。在ubuntu上安裝完運行的時候報錯:
| /usr/local/memcached/bin/memcached: error while loading sharedclibraries:mcached: error while loading sharedclibraries:mcached: error while loading sharedclibraries:mcached: error while loading sharedclibraries: such file or directory
依照:《libeven、memcached、libmemcache安裝》中的方法,使用:5/ /usr/lib/libevent-1.4.so.2 |
可以修正這個BUG
透過新得立安裝php的memcached模組,註銷/etc/php5/conf.d/memcached.ini裡面的「mcached.ini ;”,重啟apache,呼叫phpinfo()出現memcached的資訊。
$memcache = new Memcache; $version = $memcache->getVersion( ); echo "Server's version: ".$version."n"; ?>
|
1.
2. $memcache=新的Meachemcache; 4. print_r($memcache->getStats());
5. /**
6。 * 數組
7. * (
8. * [pid] => 8052
10. * [時間] => 1205898428
1 1. * [版本] => 1.2 .5 12. * => 32 13. * [rusage_user] => [rusage_system] => 0.0 00000 15. * [curr_items] => 1 16. * [total_items] => 17 17. * [位元組] => 19. * [total_connections] => 15 20. * [連結結構] => 3 21. * [cmd_get] => 9 22. _點選] => 5 24。 * [get_misses] => 4 25. * [驅逐] => 0 26. * [bytes_read] => 28. * [ limit_maxbytes] => 10485760 29. * [線程1 30。*/ 32. ? >
01.02.$memcache = 新MeCache; 1)
04.$memcache->set('name', 'leo', 0, 30); 05.if(!$memcache->add('name', 'susan', 0, 30)) 06. { 07. echo '蘇珊存在'; | 08.};
09.$memcache->replace('name', 'lion', 0, 300); 10.echo $memcache->get('name ');
11.$memcache->delete('name', 5);
12.?>
. $ port) { 03. print「memcache'$host:$port'失敗」; 04.} 05.$memcache = 新Memcache; 06.$memcache->addServer('192.168.192168.$memcache->addServer('192.168.119211211121121191211211919939939393939333333330303000090000139000139003030030030303030303030303030302.1199039003000303030030303030302。 07.$memcache->setServerParams('192.168.1.116', 11211, 1, 15, true, 08. 09.'_callback_meacheache_failure'185600000000000212120000002125 .1.116', 11211); 11.?> |
PHP快取應用:PHP MEMCACHE 詳解(2)
2010-01-28 09:38:44 來源:中國站長站綜合 【大 中 小】 站長交易(http://jy.chinaz.com)幫站長賺錢 虛擬主機評測+IDC導航=IDC123.COM
memcached的服務正式啟動
建議用物件導向的方式來測試這個函式庫:
Memcache::getVersion方法的作用是傳回執行的Memcache的版本資訊。
Memcache::getStats 方法的作用是傳回伺服器的一些運作統計資料。 Memcache::getStats方法有三個參數,第一個參數表示要求回傳的類型:reset, malloc, maps, cachedump, slabs, items, sizes;第二個參數和第三個參數是在第一個參數設定「 cachedump」時所使用的。 Memcache::getExtendedStats方法的作 用是取得進程池中所有程序的運行系統統計。
memcache_debug()函數的作用是控制調試功能,前提是php在編譯的時候使用了–enable-debug選項,否則這個函數不會有作用。
Memcache::addServer 方法的功能是增加一個可供使用的伺服器位址,Memcache::addServer方法有8個參數,除了第一個參數意外,其他都是可選的,第一個參數表 示伺服器的位址,第二個參數表示端口,第三個參數表示是否是一個持久連接,第四個參數表示這台伺服器在所有伺服器中所佔的權重,第五個參數表示連接的持續 時間,第六個參數表示連線重試的間隔時間,預設為15,設定為-1表示不進行重試,第七個參數用來控制伺服器的線上狀態,第8個參數允許設定一個回掉函數 來處理錯誤訊息。
Memcache::setServerParams方法的作用是在運行時修改伺服器的參數,Memcache::setServerParams 方法有六個參數,Memcache::addServer方法少了第三和第四個參數。 Memcache::getServerStatus方法的功能是取得執行伺服器的參數,兩個參數分別表示的位址和連接埠。
Memcache::flush方法的作用是清除所有快取的數據,但是不會削去使用的記憶體空間。
Memcache::increment方法的作用是對保存的某個key中的值進行加法操作,Memcache::decremen方法的作用是對保存的某個key中的值進行減法操作。
PHP MEMCACHE高級快取應用詳情 文章輸入:7747.Net 責任編輯:7747.Net 269
【字體:小 = new Memcache;
03.$memcache->connect('localhost', 11211); 04.$memcache->set('test_item', 8);
05.$memcache->increment('test_item', 4 4); .echo $memcache->decrement('test_item', 7); 07.// 顯示 5 08.?>
Memcache函數庫是在 PECL(PHP Extension Community Library)中,主要作用是搭建大容量的記憶體資料的
臨時存放區域,在分散式的時候作用體現的非常明顯,否則不建議使用。自己在ubuntu上安裝
完運行的時候報錯: /usr/local/memcached/bin/memcached: error while loading shared libraries: libevento-1.4.so.2: or directory
依照:《libeven、memcached、libmemcache安裝》中的方法,使用:
sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so. .2 可以修正這個BUG 透過新得立安裝php的memcached模組,註銷/etc/php5/conf.d/memcached.ini裡面的“;”,重啟apache
,呼叫phpinfo()出現memcached的資訊
執行:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die>("Ccm-notacheo( ); echo "Server's version: ".$version." n"; ?> $memcache = new $memcache = new ,mcacheo> not connect"); print_r($memcache->getStats()); /** * 數組 * ( * [pid] =>8052 * [正常運轉時間] [版本] =>1.2.5 * [pointer_size] = > 32 * [rusage_user] => 0.008000 * [rusage_system] => 0.000000 * total_items] => 17 * [位元組] => 57 * [curr_connections] => 2 * [total_connections] => 15 * [connection_structs] => 3 * 23 * [get_hits] => ; 5 * [get_misses] => 4 * [驅逐] => 0 * [bytes_read] => 671 * [bytes_w * [線程] => 1 * ) */ ?> $memcache =cmhhostMeacheache; , 11211) or die ("Could not connect"); $memcache->set( 'name', 'leo', 0, 30); if(!$meache-leo', 0, 30); if(!$meache-name)' , 0, 30)) { echo 'susan is exist'; }; $memcache->replace( 'name', 'lion',mcm); ); $memcache->delete( 'name', 5); ?> function _callback_memcmg } $memcache = new Memcache; $memcache->addServer('192.168.1.116', 11211); $memcache->setServerParams('11211); $ '_callback_memcache_failure'); echo $memcache->getServerStatus('192.168.1.116', 11211); ?> $memcache =cmcahostMe $memcache-> set('test_item', 8); $memcache->increment('test_item', 4); echo $memcache->decrement('test_item', 7); ///
/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 pid memcached的服務正式啟動
Memcache::add —新增一個值,如果已經存在,則回傳falseMemcache::addServer — 新增一個可供使用的伺服器位址 Memcache::close — 關閉一個Memcache物件 Memcache::connect — 功能 Memcache::decrement — 對已儲存的某個key中的值進行減法操作 Memcache::delete — 刪除一個key值 Memcache::flush — 清除所有快取的資料 Memcache::get Memcache::getExtendedStats — 獲取進程池中所有進程的運行系統統計 Memcache::getServerStatus — 獲取運行伺服器的參數 Memcache::getStats — 返回伺服器的一些運行統計資料::M的版本資訊 Memcache::increment — 對已儲存的某個key中的值進行加法操作 Memcache::pconnect — 建立Memcache的持久連結物件 Memcache::replace — R對一個現有的key進行覆寫操作 Memcache::set — 新增一個值,如果已經存在,則覆寫 Memcache::setCompressThreshold — 對大於某一大小的資料進行壓縮Memcache::setServerParams — 在執行時修改伺服器的參數物件的方式來測試這個函式庫:
Memcache::getVersion方法的作用是傳回執行的Memcache的版本資訊。
Memcache::getStats 方法的作用是傳回伺服器的一些運作統計資料。 Memcache::getStats方法有三個參數,第一個參數表示要求回傳的類型:reset, malloc, maps, cachedump, slabs, items, sizes;第二個參數和第三個參數是在第三個參數是在第三個參數是在第三個參數一個參數設定為“cachedump”時使用的。 Memcache::getExtendedStats方法的作用是取得進程池中所有程序的運行系統統計。 Memcache::connect方法的作用是建立一個Memcache物件。 Memcache::pconnect方法的作用是創建一個Memcache的持久連接物件。 Memcache::close方法的作用是關閉一個Memcache物件。 Memcache::set 方法的作用是增加一個值,Memcache::set方法有四個參數,第一個參數是key,第二個參數是value,第三個參數可選,表示是否壓縮保存,第四個參數可選,用來設定一個過期自動銷毀的時間。 Memcache::add方法的功能和Memcache::set方法類似,差異是如果 Memcache::add方法的回傳值為false,表示這個key已經存在,而Memcache::set方法則會直接覆寫。 Memcache::get方法的功能是取得一個key值,Memcache::get方法有一個參數,表示key。 Memcache::replace 方法的功能是對一個已有的key進行覆寫操作,Memcache::replace方法有四個參數,作用和Memcache::set方法的相同。 Memcache::delete方法的功能是刪除一個key值,Memcache::delete方法有兩個參數,第一個參數表示key,第二個參數可選,表示刪除延遲的時間。
memcache_debug()函數的作用是控制偵錯功能,前提是php在編譯的時候使用了–enable-debug選項,否
則這個函數不會有作用。
Memcache::addServer 方法的作用是增加一個可供使用的伺服器位址,Memcache::addServer方法有8個參
數,除了第一個參數意外,其他都是可選的,第一個參數表示伺服器的位址,第二個參數表示端口,第三個參數表示是否是一個持久連接,第四個參數表示這台伺服器在所有伺服器中所佔的權重,第五個參數表示連線的持續時間,第六個參數表示連線重試的間隔時間,預設為15,設定為-1表示不進行重試,第七個參數用來控制伺服器的線上狀態,第8個參數允許設定一個回掉函數來處理錯誤訊息。 Memcache::setServerParams方法的作用是在運行時修改伺服器的參數,Memcache::setServerParams方法
有六個參數,Memcache::addServer方法少了第三和第四個參數。 Memcache::getServerStatus方法的作
用是取得運作伺服器的參數,兩個參數分別表示的位址和連接埠。 Memcache::flush方法的作用是清除所有快取的數據,但是不會削去使用的記憶體空間。
Memcache::increment方法的作用是對保存的某個key中的值進行加法操作,Memcache::decremen方法的作
用是對保存的某個key中的值進行減法操作。
Discuz!的Memcache快取實作
前言: 在PHP+MySQL架構的站點中,本文重點從MySQL的角度去分析如何使Discuz!論壇(或類似的PHP+MySQL架構的程式)應對大訪問 量。同時給出一些使用Memcache去減輕MySQL壓力的建議。其中許多數據是個人測試的結果,如有不同意見,請留言告之。另外由於個人思考的問 題,行文比較跳躍,特此聲明! 系統分析: 單純的從MySQL的角度出發,單一MySQL的資料庫負載到每天上億次的操作(每秒大概1100次MySQL操作,然後乘以86400)應該不是非常困 難的事情。依照這個資料也就是說一個單MySQL伺服器的論壇來說可以跑到2千萬PV是不成問題的,我相信國內絕大部分的論壇都不可能做到每天2千萬的 PV,但實際情況並不是如此。當論壇PV超過百萬的時候一台WEB早已經不堪負荷了。 就我手邊的一些資料顯示,目前的Discuz!論壇的基本伺服器架構是前面Squid頂著,後面才是一台DB在撐著。在這種架構中,web伺服器壓力增加可 以透過並行增加伺服器解決,而MySQL壓力卻無處釋放,在不考慮MySQL官方服務的情況下,我們透過合理的利用Memcache是可以達到減輕 MySQL伺服器負載的。 可能會有朋友說我們可以對資料表進行分錶(註:此處分錶是指透過PHP程式去分錶,例如pw,dv的分錶)處理,但是目前的情況是一台DB伺服器已經不能支撐目前的資料處理了,透過PHP對MySQL進行的分錶依然無法減輕MySQL的負載。 (註:本段文字針對已經成型的系統,如果是獨立開發的系統在架構 前期就進行資料的同步分區還是不錯的。) 還可能有朋友會說利用MySQL的主從構架,如果你提出這個問題,我就很明確的告訴你,回去看看手冊吧。在Mysql Master/Slave 模式中,Slave主要是來備份資料的,只有當Master故障時,Slave才會接過Master的服務,對外部請求進行處理,直到Master恢 復正常。是說:在Master/Slave中,要嘛是Master在服務,要嘛是Slave在服務,不會Master/Slave同時提供服務。使用 MySQL主從仍無法有效的降低MySQL的負載。 或許你又會問我為什麼不使用MySQL集群(MySQL Cluster),那可是白花花的銀子啊,同等金錢的付出下,獲得最大的收益才是王道。 PS:說句題外話,MySQL手冊中將MySQL叢集解釋為MySQL簇,不習慣。 其實在MySQL5.1中的MySQL分區(MySQL Partition)是個很好的東西,它允許根據可以設定為任意大小的規則,跨檔案系統分配單一表格的多個部分。實際上,表格的不同部分在不同的位置被儲存為 單獨的表。我認為這個是當前情況下,最積極有效的降低MySQL負載的解決方法之一。但遺憾的是,這種MySQL分區的方式我個人沒有使用過的經歷, 也沒有相當充分的案例顯示它是穩定的或不穩定的。所以我還在徘徊。如果你知道,請麻煩告之!有朋友說騰訊是在用MySQL分區,但很遺憾的是我沒有 得到確切的資料。 好了分析總結了這麼多降低MySQL負載的方式之後,在用戶環境需求等特定條件下,我得出結論在當前情況下,緩解Discuz!論壇的MySQL負載比較有效的方法就是使用Memcache! 使用Memcache的理由: 1.Web Server(Lighttpd、Nginx據說都比Apache效率高很多,大家可以試用下)對CPU要求高,對記憶體需求低;而Memcached Server是對CPU要求低,對記憶體需求高,所以可以搭配使用。在對前端的Web Server上安裝Memcached Server是可行的。 2.金錢金錢金錢,最少的付出,獲得最大的利益。 3.簡單簡單簡單,對於一個架構合理的系統來說,添加Memcache的支援可能只是一個批量處理文件的過程 Discuz!使用Memcache 1.在config.inc.php中增加 $memcachehost = '127.0 '127.0 .0.1'; $memcacheport = 11211; $memcachelife = 60; 2.include/common.inc.php中 $memm= 3.修改include/db_mysql.class.php中的fetch_array、query這兩個方法,並加入query_mysql方法,程式碼如下: function fetch_array($query, $ ($query, $result_type) : $query[0]; } function query_memcache($sql, $type = '') { (!($query = $mem->get($key))) { $query = $this->query($sql, $type); while($item = $this->fetch_array($query) ) { $res[] = $item; } $query = $res; $mem->set($key, $query , query($sql, $type = '') { global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes; $func 'mysql_unbuffered_query' : 'mysql_query'; if(!($query = $func($sql, $this->link)) && $type != 'SILENT') { $this->halt(5)'o sql); } if(substr($sql, 0, 6) == 'SELECT') { echo 'Cache SQL:'.$sqlSQL'';F } .$sql.' '; } $this->querynum++; return $query; } 4.將需要使用Memcache快取的查詢db->query_memcache( 留意並將 while($post = $db->fetch_array($query)) { 修改為 foreach($query as_$post)修改。 下面程式碼有用的就拿去: preg_replace("/while
[Math Processing Error] )/is", "foreach($query as $\1)", 個小工具批量替換下就可以了。 在EditPlus中可以這樣替換:while
[Math Processing Error] )替換為foreach($query as $1) 5.完成了,測試吧! ~ 參考資料: 對Memcached有疑問的朋友可以參考下列文章: Linux下的Memcache安裝:http://www.ccvita.com/index.php/257.html Windows下的Memcache安裝:http: //www.ccvita.com/index.php/258.html Memcache基礎教學:http://www.ccvita.com/index.php/259.html Discuz!的Memcache快取實作:http://www .ccvita.com/index.php/261.html
以上就介紹了使用Memcache在PHP中調試方法的介紹及應用,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。
|