導航:首頁 > 編程語言 > phpmemcache應用

phpmemcache應用

發布時間:2022-12-12 12:26:19

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

② php中memcache如何使用

額,你這個提問能否細化點…不知如何給你解釋!
你是指的安裝?還是操作使用!

③ php怎麼操作memcache啊

在PHP中要使用memcached首先下載 memcached-client.php,在下載了memcached-client.php 之後,就可以通過這個文件中的類「memcached」對 memcached 服務進行操作了。其實代碼調用非常簡單,主要會用到的方法有 add()、get()、replace() 和 delete(),方法說明如下:add ($key, $val, $exp = 0)往 memcached 中寫入對象,$key 是對象的唯一標識符,$val 是寫入的對象數據,$exp 為過期時間,單位為秒,默認為不限時間;get ($key)http://www.phpnewer.com/index.php/Tszj/detail/id/404

④ php操作memcacheq

$arr=array(1,2,3,4,5);

$q->set("queque_1",$arr);
這樣,你取的時候就會是一個數組了

⑤ 如何利用php操作memcache

  1. php.ini設置開始memcached開啟

  2. 安裝memcached擴展

  3. php頁面實力化調用,memcache自帶函數運用設置

⑥ php java 使用memcache 有何不同

通過telnet memcache服務及memcache協議發現flag不一致,進一步分析源碼,得到以下不同:
.NET
internal enum SerializedType : ushort
{
ByteArray = 0,
Object = 1,
String = 2,
Datetime = 3,
Bool = 4,
//SByte = 5, //Makes no sense.
Byte = 6,
Short = 7,
UShort = 8,
Int = 9,
UInt = 10,
Long = 11,
ULong = 12,
Float = 13,
Double = 14,

CompressedByteArray = 255,
CompressedObject = 256,
CompressedString = 257,
}

JAVA:
public static final int MARKER_BYTE = 1;
public static final int MARKER_BOOLEAN = 8192;
public static final int MARKER_INTEGER = 4;
public static final int MARKER_LONG = 16384;
public static final int MARKER_CHARACTER = 16;
public static final int MARKER_STRING = 32;
public static final int MARKER_STRINGBUFFER = 64;
public static final int MARKER_FLOAT = 128;
public static final int MARKER_SHORT = 256;
public static final int MARKER_DOUBLE = 512;
public static final int MARKER_DATE = 1024;
public static final int MARKER_STRINGBUILDER = 2048;
public static final int MARKER_BYTEARR = 4096;
public static final int F_COMPRESSED = 2;
public static final int F_SERIALIZED = 8;

修改了.NET中部分flag定義,考慮到每種語言的不同性,所以只保證簡單的字元串能夠在各語言中通用,把 String = 2,改為 String = 32,

這樣也能保證php中沒問題。php在$mem->set(key,value,32expire);這個32是必須的(表示字元串)。對象的話可以轉為json再存到memcache中去,(這是使用pecl中memcache這個客戶端的情況)

另外關於hash演算法的,考慮到通用,使用crc32來做hash演算法,需要修改ServerPool中
internal ServerPool(string[] hosts) {
List<SocketPool> pools = new List<SocketPool>();
foreach(string host in hosts) {
SocketPool pool = new SocketPool(this, host.Trim());
pools.Add(pool);
}
hostList = pools.ToArray();
}
internal SocketPool GetSocketPool(uint hash) {
if (hostList.Length == 1) {
return hostList[0];
}
return hostList[hash % hostList.Length];
}
及MemcachedClient中hash方法的代碼為使用crc32

寫到這問題並沒有完全解決,當使用http://pecl.php.net/package/memcache做php客戶端的情況,這個客戶端不支持選擇自己需要的hash演算法,並且此客戶端已經很久沒有更新了。

首推使用http://pecl.php.net/package/memcached做php客戶端,問題還沒完,進過測試發現這樣的情況:
java寫入,php、.net均可正常讀取
.net寫入,php、java均可正常讀取
php寫入,java無法正常讀取,.net可正常讀取,
分析源代碼發現,這個php客戶端寫入數據的時候,flag總設置為0,沒有設置成我們需要的,為了保證三大語言均能正常讀取寫入,我們可以更改源代碼php_memcached.c中的static void php_memc_store_impl(INTERNAL_FUNCTION_PARAMETERS, int op, zend_bool by_key)方法,在switch(op)增加一行代碼 flags = 32;這樣設置後,phpize、./configure、make、make install。
這樣設置有個前提,所有存入memcache中的對象均需序列號,數據讀取出來後再反序列化即可,當然,其它簡單數據類型也需要轉換成字元串才能存入到memcache中去。

⑦ memcache緩存 如何實現php

php實現memcache緩存示例講解

共享內存是一種在相同機器中的應用程序之間交換數據的有效方式,本文說的是php實現memcache緩存示例,大家參考使用吧

概述
共享內存是一種在相同機器中的應用程序之間交換數據的有效方式。一個進程可創建一個可供其他進程訪問的內存段,只要它分配了正確的許可權。每個內存段擁有一個惟一的 ID(稱為 shmid),這個 ID 指向一個物理內存區域,其他進程可在該區域操作它。創建並提供了合適的許可權之後,同一台機器中的其他進程就可以操作這些內存段:讀取、寫入和刪除。
這表明使用 C 語言編寫的應用程序可與使用其他語言(比如 Java™ 或 PHP)編寫的應用程序共享信息。它們都可以共享信息,只要它們可訪問和理解該信息。共享內存在針對大部分語言的實現中得到了廣泛使用,所以訪問應該不是問題。要理解信息,我們可以使用一種標准格式,比如 XML 或 JSON。
共享內存的使用是一種在進程之間交換數據的快速方法,主要因為在創建內存段之後傳遞數據,不會涉及內核。這種方法常常稱為進程間通信 (IPC)。其他 IPC 方法包括管道、消息隊列、RPC 和套接字。當使用需要彼此通信的應用程序的生態系統時,這種在應用程序之間快速、可靠地交換數據的能力非常有用。取決於生態系統的大小,使用資料庫在應用程序之間交換信息的常用方法常常會導致查詢緩慢,甚至 I/O 阻塞。使用共享內存,沒有 I/O 會減緩開發人員的進度。
本文的提議非常簡單,學習如何使用 PHP 創建和操作共享內存段,使用它們存儲可供其他應用程序使用的數據集。即使沒有使用共享內存交換數據的計劃,它本身也在許多好處,因為它使應用程序能夠遠離 I/O 問題。將數據集直接存儲在內存中具有諸多優勢,從 Web 服務數據緩存到會話共享。它是一個非常有用的概念,每個 PHP 開發人員都應該知道。
共享內存和 PHP
PHP 擁有豐富的可用擴展,共享內存也一樣。使用一些共享的函數,無需安裝任何擴展,開發人員就能夠輕松操作內存段。
創建內存段
共享內存函數類似於文件操作函數,但無需處理一個流,您將處理一個共享內存訪問 ID。第一個示例就是 shmop_open 函數,它允許您打開一個現有的內存段或創建一個新內存段。此函數非常類似於經典的 fopen 函數,後者打開用於文件操作的流,返回一個資源供其他希望讀取或寫入該打開的流的函數使用。讓我們看看清單 1 中的 shmop_open。
清單 1. shmop_open 函數

復制代碼代碼如下:

<?php
$systemid = 864; // System ID for the shared memory segment
$mode = "c"; // Access mode
$permissions = 0755; // Permissions for the shared memory segment
$size = 1024; // Size, in bytes, of the segment

$shmid = shmop_open($systemid, $mode, $permissions, $size);
?>

該函數中出現的第一個事物是系統 ID 參數。這是標識系統中的共享內存段的數字。第二個參數是訪問模式,它非常類似於 fopen 函數的訪問模式。您可以在 4 種不同的模式下訪問一個內存段:
•模式 「a」,它允許您訪問只讀內存段
•模式 「w」,它允許您訪問可讀寫的內存段
•模式 「c」,它創建一個新內存段,或者如果該內存段已存在,嘗試打開它進行讀寫
•模式 「n」,它創建一個新內存段,如果該內存段已存在,則會失敗
第三個參數是內存段的許可權。您必須在這里提供一個八進制值。
第四個參數提供內存段大小,以位元組為單位。在寫入一個內存段之前,您必須在它之上分配適當的位元組數。
請注意,此函數返回一個 ID 編號,其他函數可使用該 ID 編號操作該共享內存段。這個 ID 是共享內存訪問 ID,與系統 ID 不同,它以參數的形式傳遞。請注意不要混淆這兩者。如果失敗,shmop_open 將返回 FALSE。
向內存段寫入數據
使用 shmop_write 函數向共享內存塊寫入數據。此函數的使用很簡單,它僅接受 3 個參數,如清單 2 所示。
清單 2. 使用 shmop_write 向共享內存塊寫入數據

復制代碼代碼如下:

<?php

$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
?>

這個函數類似於 fwrite 函數,後者有兩個參數:打開的流資源(由 fopen 返回)和您希望寫入的數據。shmop_write 函數也執行此任務。
第一個參數是 shmop_open 返回的 ID,它識別您操作的共享內存塊。第二個參數是您希望存儲的數據,最後的第三個參數是您希望開始寫入的位置。默認情況下,我們始終使用 0 來表示開始寫入的位置。請注意,此函數在失敗時會返回 FALSE,在成功時會返回寫入的位元組數。

從內存段讀取數據
從共享內存段讀取數據很簡單。您只需要一個打開的內存段和 shmop_read 函數。此函數接受一些參數,工作原理類似於 fread。參見清單 3,讀取一個 PHP 文件的內容。
清單 3. 使用 shmop_read 讀取一個文件的內容

復制代碼代碼如下:

<?php

$stream = fopen('file.txt', 'r+');
fwrite($stream, "Hello World!");
echo fread($stream, 11);
?>

讀取共享內存段的內容的過程與此類似,如清單 4 所示:
清單 4. 讀取共享內存段的內容

復制代碼代碼如下:

<?php

$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
echo shmop_read($shmid, 0, 11);
?>

請留意這里的參數。shmop_read 函數將接受 shmop_open 返回的 ID,我們已知道它,不過它還接受另外兩個參數。第二個參數是您希望從內存段讀取的位置,而第三個是您希望讀取的位元組數。第二個參數可以始終為 0,表示數據的開頭,但第三個參數可能存在問題,因為我們不知道我們希望讀取多少位元組。
這非常類似於我們在 fread 函數中的行為,該函數接受兩個參數:打開的流資源(由 fopen 返回)和您希望從該流讀取的位元組數。使用filesize 函數(它返回一個文件中的位元組數)來完整地讀取它。
幸運的是,當使用共享內存段時,shmop_size 函數返回一個內存段的大小(以位元組為單位),類似於 filesize 函數。參見清單 5。
清單 5. shmop_size 函數返回內存段大小,以位元組為單位

復制代碼代碼如下:

<?php

$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
$size = shmop_size($shmid);
echo shmop_read($shmid, 0, $size);
?>

回頁首
刪除內存段
我們學習了如何打開、寫入和讀取共享內存段。要完成我們的 CRUD 類,我們還需要學習如何刪除內存段。該任務可使用 shmop_delete 函數輕松完成,該函數僅接受一個參數:我們希望刪除的共享內存 ID。
清單 6. shmop_delete 標記要刪除的內存段

復制代碼代碼如下:

<?php

$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
shmop_delete($shmid);
?>

這不會實際刪除該內存段。它將該內存段標記為刪除,因為共享內存段在有其他進程正在使用它時無法被刪除。shmop_delete 函數將該內存段標記為刪除,阻止任何其他進程打開它。要刪除它,我們需要關閉該內存段。
關閉內存段
打開一個共享內存段會 「附加」 到它。附加該內存段之後,我們可在其中進行讀取和寫入,但完成操作後,我們必須從它解除。這使用清單 7 中的 shmop_close 函數來完成。
這非常類似於處理文件時的 fclose 函數。打開包含一個文件的流並在其中讀取或寫入數據後,我們必須關閉它,否則將發生鎖定。
清單 7. 使用 shmop_close 與一個內存段分開

復制代碼代碼如下:

<?php

$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
shmop_delete($shmid);
shmop_close($shmid);
?>

使用共享內存作為一個存儲選項
有了共享內存和共享內存段上基本 CRUD 操作的基本知識,是時候應用此知識了。我們可以使用共享內存作為一種獨特的存儲選項,提供快速讀/寫操作和進程互操作性等優勢。對於 Web 應用程序,這意味著:
•緩存存儲(資料庫查詢、Web 服務數據、外部數據)
•會話存儲
•應用程序之間的數據交換
在繼續之前,我想介紹一個名為 SimpleSHM 小型庫。SimpleSHM 是一個較小的抽象層,用於使用 PHP 操作共享內存,支持以一種面向對象的方式輕松操作內存段。在編寫使用共享內存進行存儲的小型應用程序時,這個庫可幫助創建非常簡潔的代碼。要了解 SimpleSHM,請訪問GitHub 頁面。
您可以使用 3 個方法進行處理:讀、寫和刪除。從該類中簡單地實例化一個對象,可以控制打開的共享內存段。清單 8 展示了基本用途。
清單 8. SimpleSHM 基本用途

復制代碼代碼如下:

<?php

$memory = new SimpleSHM;
$memory->write('Sample');
echo $memory->read();
?>

請注意,這里沒有為該類傳遞一個 ID。如果沒有傳遞 ID,它將隨機選擇一個編號並打開該編號的新內存段。我們可以以參數的形式傳遞一個編號,供構造函數打開現有的內存段,或者創建一個具有特定 ID 的內存段,如清單 9 所示。
清單 9. 打開一個特定的內存段

復制代碼代碼如下:

<?php

$new = new SimpleSHM(897);
$new->write('Sample');
echo $new->read();
?>

神奇的方法 __destructor 負責在該內存段上調用 shmop_close 來取消設置對象,以與該內存段分離。我們將這稱為 「SimpleSHM 101」。現在讓我們將此方法用於更高級的用途:使用共享內存作為存儲。存儲數據集需要序列化,因為數組或對象無法存儲在內存中。盡管這里使用了 JSON 來序列化,但任何其他方法(比如 XML 或內置的 PHP 序列化功能)也已足夠。清單 10 給出了一個示例。
清單 10. 使用共享內存作為存儲

復制代碼代碼如下:

<?php

require('SimpleSHM.class.php');
$results = array(
'user' => 'John',
'password' => '123456',
'posts' => array('My name is John', 'My name is not John')
);
$data = json_encode($results);
$memory = new SimpleSHM;
$memory->write($data);
$storedarray = json_decode($memory->read());
print_r($storedarray);
?>

我們成功地將一個數組序列化為一個 JSON 字元串,將它存儲在共享內存塊中,從中讀取數據,去序列化 JSON 字元串,並顯示存儲的數組。這看起來很簡單,但請想像一下這個代碼片段帶來的可能性。您可以使用它存儲 Web 服務請求、資料庫查詢或者甚至模板引擎緩存的結果。在內存中讀取和寫入將帶來比在磁碟中讀取和寫入更高的性能。
使用此存儲技術不僅對緩存有用,也對應用程序之間的數據交換也有用,只要數據以兩端都可讀的格式存儲。不要低估共享內存在 Web 應用程序中的力量。可採用許多不同的方式來巧妙地實現這種存儲,惟一的限制是開發人員的創造力和技能

⑧ PHP中的Memcache和memcached的區別 Memcache的操作方法

Memcached和Memcache是Memcached伺服器的擴展


⑨ thinkphp裡面怎樣配置memcache

THINKPHP 自帶memcache 擴展。


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

⑩ 怎麼在php項目中應用memcache查了老半天,還是不明白怎麼在自己的項目中應用memcache

也差不多這個意思. 原理是這樣:

在查詢數據的時候,先從memcache裡面獲取,如果不存在就查詢資料庫操作同時寫入memcache,反之存在則從memcache裡面讀取即可.

閱讀全文

與phpmemcache應用相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163