天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

php實(shí)現(xiàn)memcache緩存示例講解

概述

共享內(nèi)存是一種在相同機(jī)器中的應(yīng)用程序之間交換數(shù)據(jù)的有效方式。一個(gè)進(jìn)程可創(chuàng)建一個(gè)可供其他進(jìn)程訪問(wèn)的內(nèi)存段,只要它分配了正確的權(quán)限。每個(gè)內(nèi)存段擁有一個(gè)惟一的 ID(稱為 shmid),這個(gè) ID 指向一個(gè)物理內(nèi)存區(qū)域,其他進(jìn)程可在該區(qū)域操作它。創(chuàng)建并提供了合適的權(quán)限之后,同一臺(tái)機(jī)器中的其他進(jìn)程就可以操作這些內(nèi)存段:讀取、寫(xiě)入和刪除。

這表明使用 C 語(yǔ)言編寫(xiě)的應(yīng)用程序可與使用其他語(yǔ)言(比如 Java™ 或 php)編寫(xiě)的應(yīng)用程序共享信息。它們都可以共享信息,只要它們可訪問(wèn)和理解該信息。共享內(nèi)存在針對(duì)大部分語(yǔ)言的實(shí)現(xiàn)中得到了廣泛使用,所以訪問(wèn)應(yīng)該不是問(wèn)題。要理解信息,我們可以使用一種標(biāo)準(zhǔn)格式,比如 XML 或 JSON。
共享內(nèi)存的使用是一種在進(jìn)程之間交換數(shù)據(jù)的快速方法,主要因?yàn)樵趧?chuàng)建內(nèi)存段之后傳遞數(shù)據(jù),不會(huì)涉及內(nèi)核。這種方法常常稱為進(jìn)程間通信 (IPC)。其他 IPC 方法包括管道、消息隊(duì)列、RPC 和套接字。當(dāng)使用需要彼此通信的應(yīng)用程序的生態(tài)系統(tǒng)時(shí),這種在應(yīng)用程序之間快速、可靠地交換數(shù)據(jù)的能力非常有用。取決于生態(tài)系統(tǒng)的大小,使用數(shù)據(jù)庫(kù)在應(yīng)用程序之間交換信息的常用方法常常會(huì)導(dǎo)致查詢緩慢,甚至 I/O 阻塞。使用共享內(nèi)存,沒(méi)有 I/O 會(huì)減緩開(kāi)發(fā)人員的進(jìn)度。

本文的提議非常簡(jiǎn)單,學(xué)習(xí)如何使用 php 創(chuàng)建和操作共享內(nèi)存段,使用它們存儲(chǔ)可供其他應(yīng)用程序使用的數(shù)據(jù)集。即使沒(méi)有使用共享內(nèi)存交換數(shù)據(jù)的計(jì)劃,它本身也在許多好處,因?yàn)樗?a href=/pingce/yingyong/ target=_blank class=infotextkey>應(yīng)用程序能夠遠(yuǎn)離 I/O 問(wèn)題。將數(shù)據(jù)集直接存儲(chǔ)在內(nèi)存中具有諸多優(yōu)勢(shì),從 Web 服務(wù)數(shù)據(jù)緩存到會(huì)話共享。它是一個(gè)非常有用的概念,每個(gè) php 開(kāi)發(fā)人員都應(yīng)該知道。
共享內(nèi)存和 php

php 擁有豐富的可用擴(kuò)展,共享內(nèi)存也一樣。使用一些共享的函數(shù),無(wú)需安裝任何擴(kuò)展,開(kāi)發(fā)人員就能夠輕松操作內(nèi)存段。

創(chuàng)建內(nèi)存段

共享內(nèi)存函數(shù)類似于文件操作函數(shù),但無(wú)需處理一個(gè)流,您將處理一個(gè)共享內(nèi)存訪問(wèn) ID。第一個(gè)示例就是 shmop_open 函數(shù),它允許您打開(kāi)一個(gè)現(xiàn)有的內(nèi)存段或創(chuàng)建一個(gè)新內(nèi)存段。此函數(shù)非常類似于經(jīng)典的 fopen 函數(shù),后者打開(kāi)用于文件操作的流,返回一個(gè)資源供其他希望讀取或?qū)懭朐摯蜷_(kāi)的流的函數(shù)使用。讓我們看看清單 1 中的 shmop_open。

清單 1. shmop_open 函數(shù)

復(fù)制代碼 代碼如下:
<?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);

?>

該函數(shù)中出現(xiàn)的第一個(gè)事物是系統(tǒng) ID 參數(shù)。這是標(biāo)識(shí)系統(tǒng)中的共享內(nèi)存段的數(shù)字。第二個(gè)參數(shù)是訪問(wèn)模式,它非常類似于 fopen 函數(shù)的訪問(wèn)模式。您可以在 4 種不同的模式下訪問(wèn)一個(gè)內(nèi)存段:

•模式 “a”,它允許您訪問(wèn)只讀內(nèi)存段
•模式 “w”,它允許您訪問(wèn)可讀寫(xiě)的內(nèi)存段
•模式 “c”,它創(chuàng)建一個(gè)新內(nèi)存段,或者如果該內(nèi)存段已存在,嘗試打開(kāi)它進(jìn)行讀寫(xiě)
•模式 “n”,它創(chuàng)建一個(gè)新內(nèi)存段,如果該內(nèi)存段已存在,則會(huì)失敗
第三個(gè)參數(shù)是內(nèi)存段的權(quán)限。您必須在這里提供一個(gè)八進(jìn)制值。

第四個(gè)參數(shù)提供內(nèi)存段大小,以字節(jié)為單位。在寫(xiě)入一個(gè)內(nèi)存段之前,您必須在它之上分配適當(dāng)?shù)淖止?jié)數(shù)。

請(qǐng)注意,此函數(shù)返回一個(gè) ID 編號(hào),其他函數(shù)可使用該 ID 編號(hào)操作該共享內(nèi)存段。這個(gè) ID 是共享內(nèi)存訪問(wèn) ID,與系統(tǒng) ID 不同,它以參數(shù)的形式傳遞。請(qǐng)注意不要混淆這兩者。如果失敗,shmop_open 將返回 FALSE。

向內(nèi)存段寫(xiě)入數(shù)據(jù)

使用 shmop_write 函數(shù)向共享內(nèi)存塊寫(xiě)入數(shù)據(jù)。此函數(shù)的使用很簡(jiǎn)單,它僅接受 3 個(gè)參數(shù),如清單 2 所示。

清單 2. 使用 shmop_write 向共享內(nèi)存塊寫(xiě)入數(shù)據(jù)

復(fù)制代碼 代碼如下:
<?php

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

?>
 

這個(gè)函數(shù)類似于 fwrite 函數(shù),后者有兩個(gè)參數(shù):打開(kāi)的流資源(由 fopen 返回)和您希望寫(xiě)入的數(shù)據(jù)。shmop_write 函數(shù)也執(zhí)行此任務(wù)。

第一個(gè)參數(shù)是 shmop_open 返回的 ID,它識(shí)別您操作的共享內(nèi)存塊。第二個(gè)參數(shù)是您希望存儲(chǔ)的數(shù)據(jù),最后的第三個(gè)參數(shù)是您希望開(kāi)始寫(xiě)入的位置。默認(rèn)情況下,我們始終使用 0 來(lái)表示開(kāi)始寫(xiě)入的位置。請(qǐng)注意,此函數(shù)在失敗時(shí)會(huì)返回 FALSE,在成功時(shí)會(huì)返回寫(xiě)入的字節(jié)數(shù)。


從內(nèi)存段讀取數(shù)據(jù)
從共享內(nèi)存段讀取數(shù)據(jù)很簡(jiǎn)單。您只需要一個(gè)打開(kāi)的內(nèi)存段和 shmop_read 函數(shù)。此函數(shù)接受一些參數(shù),工作原理類似于 fread。參見(jiàn)清單 3,讀取一個(gè) php 文件的內(nèi)容。

清單 3. 使用 shmop_read 讀取一個(gè)文件的內(nèi)容

復(fù)制代碼 代碼如下:
<?php

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

?>
 

讀取共享內(nèi)存段的內(nèi)容的過(guò)程與此類似,如清單 4 所示:

清單 4. 讀取共享內(nèi)存段的內(nèi)容

復(fù)制代碼 代碼如下:
<?php

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

?>
 

請(qǐng)留意這里的參數(shù)。shmop_read 函數(shù)將接受 shmop_open 返回的 ID,我們已知道它,不過(guò)它還接受另外兩個(gè)參數(shù)。第二個(gè)參數(shù)是您希望從內(nèi)存段讀取的位置,而第三個(gè)是您希望讀取的字節(jié)數(shù)。第二個(gè)參數(shù)可以始終為 0,表示數(shù)據(jù)的開(kāi)頭,但第三個(gè)參數(shù)可能存在問(wèn)題,因?yàn)槲覀儾恢牢覀兿Mx取多少字節(jié)。

這非常類似于我們?cè)?fread 函數(shù)中的行為,該函數(shù)接受兩個(gè)參數(shù):打開(kāi)的流資源(由 fopen 返回)和您希望從該流讀取的字節(jié)數(shù)。使用filesize 函數(shù)(它返回一個(gè)文件中的字節(jié)數(shù))來(lái)完整地讀取它。

幸運(yùn)的是,當(dāng)使用共享內(nèi)存段時(shí),shmop_size 函數(shù)返回一個(gè)內(nèi)存段的大小(以字節(jié)為單位),類似于 filesize 函數(shù)。參見(jiàn)清單 5。

清單 5. shmop_size 函數(shù)返回內(nèi)存段大小,以字節(jié)為單位

復(fù)制代碼 代碼如下:
<?php

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

$size = shmop_size($shmid);
echo shmop_read($shmid, 0, $size);

?>

回頁(yè)首

刪除內(nèi)存段
我們學(xué)習(xí)了如何打開(kāi)、寫(xiě)入和讀取共享內(nèi)存段。要完成我們的 CRUD 類,我們還需要學(xué)習(xí)如何刪除內(nèi)存段。該任務(wù)可使用 shmop_delete 函數(shù)輕松完成,該函數(shù)僅接受一個(gè)參數(shù):我們希望刪除的共享內(nèi)存 ID。

清單 6. shmop_delete 標(biāo)記要?jiǎng)h除的內(nèi)存段

復(fù)制代碼 代碼如下:
<?php

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

?>
 

這不會(huì)實(shí)際刪除該內(nèi)存段。它將該內(nèi)存段標(biāo)記為刪除,因?yàn)楣蚕韮?nèi)存段在有其他進(jìn)程正在使用它時(shí)無(wú)法被刪除。shmop_delete 函數(shù)將該內(nèi)存段標(biāo)記為刪除,阻止任何其他進(jìn)程打開(kāi)它。要?jiǎng)h除它,我們需要關(guān)閉該內(nèi)存段。

關(guān)閉內(nèi)存段

打開(kāi)一個(gè)共享內(nèi)存段會(huì) “附加” 到它。附加該內(nèi)存段之后,我們可在其中進(jìn)行讀取和寫(xiě)入,但完成操作后,我們必須從它解除。這使用清單 7 中的 shmop_close 函數(shù)來(lái)完成。

這非常類似于處理文件時(shí)的 fclose 函數(shù)。打開(kāi)包含一個(gè)文件的流并在其中讀取或?qū)懭霐?shù)據(jù)后,我們必須關(guān)閉它,否則將發(fā)生鎖定。

清單 7. 使用 shmop_close 與一個(gè)內(nèi)存段分開(kāi)

復(fù)制代碼 代碼如下:
<?php

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

?>
 

使用共享內(nèi)存作為一個(gè)存儲(chǔ)選項(xiàng)
有了共享內(nèi)存和共享內(nèi)存段上基本 CRUD 操作的基本知識(shí),是時(shí)候應(yīng)用此知識(shí)了。我們可以使用共享內(nèi)存作為一種獨(dú)特的存儲(chǔ)選項(xiàng),提供快速讀/寫(xiě)操作和進(jìn)程互操作性等優(yōu)勢(shì)。對(duì)于 Web 應(yīng)用程序,這意味著:

•緩存存儲(chǔ)(數(shù)據(jù)庫(kù)查詢、Web 服務(wù)數(shù)據(jù)、外部數(shù)據(jù))
•會(huì)話存儲(chǔ)
應(yīng)用程序之間的數(shù)據(jù)交換
在繼續(xù)之前,我想介紹一個(gè)名為 SimpleSHM 小型庫(kù)。SimpleSHM 是一個(gè)較小的抽象層,用于使用 php 操作共享內(nèi)存,支持以一種面向?qū)ο蟮姆绞捷p松操作內(nèi)存段。在編寫(xiě)使用共享內(nèi)存進(jìn)行存儲(chǔ)的小型應(yīng)用程序時(shí),這個(gè)庫(kù)可幫助創(chuàng)建非常簡(jiǎn)潔的代碼。要了解 SimpleSHM,請(qǐng)?jiān)L問(wèn)GitHub 頁(yè)面。

您可以使用 3 個(gè)方法進(jìn)行處理:讀、寫(xiě)和刪除。從該類中簡(jiǎn)單地實(shí)例化一個(gè)對(duì)象,可以控制打開(kāi)的共享內(nèi)存段。清單 8 展示了基本用途。

清單 8. SimpleSHM 基本用途

復(fù)制代碼 代碼如下:
<?php

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

?>
 

請(qǐng)注意,這里沒(méi)有為該類傳遞一個(gè) ID。如果沒(méi)有傳遞 ID,它將隨機(jī)選擇一個(gè)編號(hào)并打開(kāi)該編號(hào)的新內(nèi)存段。我們可以以參數(shù)的形式傳遞一個(gè)編號(hào),供構(gòu)造函數(shù)打開(kāi)現(xiàn)有的內(nèi)存段,或者創(chuàng)建一個(gè)具有特定 ID 的內(nèi)存段,如清單 9 所示。

清單 9. 打開(kāi)一個(gè)特定的內(nèi)存段

復(fù)制代碼 代碼如下:
<?php

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

?>
 

神奇的方法 __destructor 負(fù)責(zé)在該內(nèi)存段上調(diào)用 shmop_close 來(lái)取消設(shè)置對(duì)象,以與該內(nèi)存段分離。我們將這稱為 “SimpleSHM 101”。現(xiàn)在讓我們將此方法用于更高級(jí)的用途:使用共享內(nèi)存作為存儲(chǔ)存儲(chǔ)數(shù)據(jù)集需要序列化,因?yàn)閿?shù)組或?qū)ο鬅o(wú)法存儲(chǔ)在內(nèi)存中。盡管這里使用了 JSON 來(lái)序列化,但任何其他方法(比如 XML 或內(nèi)置的 php 序列化功能)也已足夠。清單 10 給出了一個(gè)示例。

清單 10. 使用共享內(nèi)存作為存儲(chǔ)

復(fù)制代碼 代碼如下:
<?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);

?>
 

我們成功地將一個(gè)數(shù)組序列化為一個(gè) JSON 字符串,將它存儲(chǔ)在共享內(nèi)存塊中,從中讀取數(shù)據(jù),去序列化 JSON 字符串,并顯示存儲(chǔ)的數(shù)組。這看起來(lái)很簡(jiǎn)單,但請(qǐng)想象一下這個(gè)代碼片段帶來(lái)的可能性。您可以使用它存儲(chǔ) Web 服務(wù)請(qǐng)求、數(shù)據(jù)庫(kù)查詢或者甚至模板引擎緩存的結(jié)果。在內(nèi)存中讀取和寫(xiě)入將帶來(lái)比在磁盤(pán)中讀取和寫(xiě)入更高的性能。

使用此存儲(chǔ)技術(shù)不僅對(duì)緩存有用,也對(duì)應(yīng)用程序之間的數(shù)據(jù)交換也有用,只要數(shù)據(jù)以兩端都可讀的格式存儲(chǔ)。不要低估共享內(nèi)存在 Web 應(yīng)用程序中的力量。可采用許多不同的方式來(lái)巧妙地實(shí)現(xiàn)這種存儲(chǔ),惟一的限制是開(kāi)發(fā)人員的創(chuàng)造力和技能

php技術(shù)php實(shí)現(xiàn)memcache緩存示例講解,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美午夜不卡在线观看 | 在线中文高清资源免费观看 | 国内精品人妻无码久久久影院蜜桃 | 亚洲人成在线播放网站岛国 | 白人大战34厘米黑人BD | 日本亚洲中文字幕无码区 | 欧式午夜理伦三级在线观看 | 电影日本妻子 | 欧美一区二区日韩一区二区 | 精品 在线 视频 亚洲 | 熟妇内谢69XXXXXA片 | 亚洲成人黄色在线 | 国产午夜精品一区理论片飘花 | 亚洲精品AV一区午夜福利 | 久久精品美女久久 | 亚洲国产成人一区二区在线 | 亚洲欧美一区二区三区久久 | 国产成+人+综合+亚洲不卡 | 久久精品电影久久电影大全 | 亚洲AV无码专区国产乱码网站 | 99视频这里只有精品国产 | 日本理论片和搜子同居的日子2 | 久久婷婷久久一区二区三区 | 久久国产香蕉视频 | 一二三四在线视频社区 | 国产精品人妻无码久久久蜜桃 | 人妻熟妇乱又伦精品视频中文字幕 | 国产扒开美女双腿屁股流白浆 | 我的家庭女教师 | 内射无码AV-区二区在线观看 | 久久亚洲这里只有精品18 | 青柠电影高清在线观看 | WWW国产精品人妻一二三区 | 稚嫩挤奶h调教h | 十分钟免费观看大全视频 | 成人天堂婷婷青青视频在线观看 | 美女尿口羞羞视频 | 99国产精品久久人妻无码 | 6080yy 久久 亚洲 日本 | 免费观看桶机十分钟 | 亚洲精品九色在线网站 |