導航:首頁 > 編程語言 > php連接memcached

php連接memcached

發布時間:2023-05-29 14:12:43

php 使用memcached 怎麼做登錄

原本就不應該用memcached來保存登錄狀態,如果非要用memcached做點跟登錄有關的事,那就用它來保存以下用戶信息就行了。
登錄信息保存在session或者cookie里,session會更安全,cookie可以長期保存。每次操作都用session或cookie里的登錄信息與資料庫里或memcached里的用戶信息做驗證。
memcached其實是一個內存管理工具,它並非PHP的一部分,只是正好PHP可以使用它。

Ⅱ Memcache 連接超時 什麼原因

Memcached存儲單個item最大數據是在1MB內,如果數據超過1M,存取set和get是都是返回false,而且引起性能的問題。

我們之前對排行榜的數據進行緩存,由於排行榜在我們所有sql select查詢裡面佔了30%,而且我們排行榜每小時更新一次,所以必須對數據做緩存。為了清除緩存方便,把所有的用戶的數據放在同一key中,由於memcached:set的時候沒有壓縮數據。在測試服測試的時候,沒發現問題,當上線的時候,結果發現,在線人數剛剛490人的時候,伺服器load average飄到7.9。然後我們去掉緩存,一下子就下降到0.59。

所以Memcahce不適合緩存大數據,超過1MB的數據,可以考慮在客戶端壓縮或拆分到多個key中。大的數據在進行load和uppack到內存的時候需要花很長時間,從而降低伺服器的性能。

Memcached支持最大的存儲對象為1M。這個值由其內存分配機制決定的。

memcached默認情況下採用了名為Slab Allocator的機制分配、管理內存。在該機制出現以前,內存的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是,這種方式會導致內存碎片,加重操作系統內存管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢。Slab Allocator就是為解決該問題而誕生的。Slab Allocator的基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題.

今天(2012-03-16)我們重新測試了memcached ::set的數據大小。可能是我們用php的memcached擴展是最新版,set數據的時候是默認壓縮的。set 數據:

$ac = new memcahed();
$data = str_repeat('a', 1024* 1024); //1M的數據
$r = $ac->set('key', $data, 9999);
//或者
$data = str_repeat('a', 1024* 1024*100);//100M的數據
$r = $ac->set('key', $data, 9999);
不論是1M的數據還是100M的數據,都能set成功。後來我發現,memcachedset數據的時候是默認壓縮的。由於這個這個是重復的字元串,壓縮率高達1000倍。因此100M的數據壓縮後實際也就100k而已。

當我設置:

$ac->setOption(memcahed::OPT_COMPRESSION,0); //不壓縮存儲數據。
$data = str_repeat('a', 1024* 1024); //1M數據
$r = $ac->set('key', $data, 9999);//1M的數據set不成功。
也就是說memcached server不能存儲超過1M的數據,但是經過客戶端壓縮數據後,只要小於1M的數據都能存儲成功。

memcached相關知識:

1、memcached的基本設置
1)啟動Memcache的伺服器端
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB,
-u是運行Memcache的用戶,我這里是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這里指定了伺服器的IP地址192.168.0.200,
-p是設置Memcache監聽的埠,我這里設置了12000,最好是1024以上的埠,
-c選項是最大運行的並發連接數,默認是1024,我這里設置了256,按照你伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid,

2)如果要結束Memcache進程,執行:

# kill `cat /tmp/memcached.pid`

哈希演算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該

段落的一個字母,隨後的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的。

2、適用memcached的業務場景?

1)如果網站包含了訪問量很大的動態網頁,因而資料庫的負載將會很高。由於大部分資料庫請求都是讀操作,那麼memcached可以顯著地減小資料庫負載。

2)如果資料庫服務

Ⅲ 使用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"}
}
}

Ⅳ 如何設置memcached來共享php的session

有3種設置方法,都是通過設置php.ini(也就是php的配置文件)來進行設置的
1.直接修改php.ini配置文件

1
2
3

session.save_handler = memcache //設置session的儲存方式為memcache
memcache.hash_strategy = "consistent"//設置memcache的hash演算法
session.save_path = "tcp://127.0.0.100:11211" //設置session儲存的位置,多台memcache用逗號隔開,例如:tcp://127.0.0.1:11211,tcp://127.0.0.1:12000

2.利用目錄下的 .htaccess 文件配置 (apache支持,nginx需要配置)

1
2

php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"

3.在項目的PHP文件中修改配置 (哪個頁面用就在哪個頁面寫)

1
2

ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.100:11211");

Ⅳ thinkphp裡面怎樣配置memcache

THINKPHP 自帶memcache 擴展。


這樣解決就可以了,簡單粗暴,個人建議還是去後盾網去經常看看教學視頻學習學習吧

Ⅵ 為什麼我安裝了php的memcached擴展,使用php -m 無法找到memcached,但是在phpinfo()裡面卻能看到

ubuntu16.04安裝php-memcached,須升級原有的php-m方可正常使用,請參考

Ⅶ php怎麼開啟memcache

下載memcache安裝包和php擴展文件php_memcache.dll。解壓memcache,把memcached移動到C盤。

單擊開始菜單,運行「cmd」。
cd .. //進入c盤
cd memcached //進入memcache目錄
memcache.exe -d install //安裝memcache服務

設置php:找到php安裝目錄,打開php.ini文件。找到配置文件里允許支持擴展的區域exetension=。。,添加一行exetension=php_memcache.dll。

把php擴展文件php_memcache.dll移動到php安裝目錄下的ext目錄下。注意在php.ini中要設置好exetension目錄。php_memcache.dll此文件需要先在網上下載下來!

設置apache:
打開apache配置文件httpd.conf,找到LoadMole載入模塊區域。去掉前面的「LoadMole mem_cache_mole moles/mod_mem_cache.so」#號

重啟apache服務。linux下重啟使用命令:service httpd restart。

然後就大功告成!

Ⅷ memcached緩存錯誤

安裝以後,啟動服務,memcached開始運行,php中memcached的擴展是用來php連接memcached用的,就像是mysql擴展是php連接mysql用,memcached主要作用是緩存mysql資料庫的,需要在php中定義訪問memcached,如果沒有數據,php去訪問mysql,然後通過php代碼告訴memcached你給我緩存數據。我理解的就是這樣,我不是開發,是運維。

閱讀全文

與php連接memcached相關的資料

熱點內容
負數的源碼如何得出 瀏覽:558
只有一個伺服器怎麼查數據 瀏覽:951
python為什麼不用定義變數 瀏覽:233
文件夾後退以後消失了 瀏覽:146
金主文bl壓縮包百度雲 瀏覽:704
360怎麼鎖定一個文件夾 瀏覽:147
優加密卷怎麼去查答案 瀏覽:538
王者榮耀安卓微信區如何掃碼上號 瀏覽:398
招商app申請凍結怎麼申請解凍 瀏覽:442
adspdf 瀏覽:78
unix命令rename 瀏覽:866
文件加密了為啥發不出去了 瀏覽:457
單片機調節馬達 瀏覽:743
鏡花pdf 瀏覽:610
廣西民族大學app忘記密碼怎麼辦 瀏覽:374
學生伺服器是什麼意思 瀏覽:533
如何下載快切app 瀏覽:723
如何將電腦c盤文件加密 瀏覽:886
嵌入式為什麼linux 瀏覽:553
c語言編譯器屬於系統軟體 瀏覽:727