監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

PHP在共享內(nèi)存中存儲(chǔ)數(shù)據(jù)集

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

 共享內(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)存段:讀取、寫入和刪除。

  這標(biāo)明運(yùn)用 C 言語(yǔ)編寫的應(yīng)用程序可與運(yùn)用其他言語(yǔ)(比方 Java™ 或 PHP)編寫的應(yīng)用程序共享信息。它們都能夠共享信息,只需它們可訪問(wèn)和了解該信息。共享內(nèi)存在針對(duì)大局部言語(yǔ)的完成中得到了普遍運(yùn)用,所以訪問(wèn)應(yīng)該不是問(wèn)題。要了解信息,我們能夠運(yùn)用一種規(guī)范格式,比方 XML 或 JSON。

  共享內(nèi)存的運(yùn)用是一種在進(jìn)程之間交流數(shù)據(jù)的快速辦法,主要由于在創(chuàng)立內(nèi)存段之后傳送數(shù)據(jù),不會(huì)觸及內(nèi)核。這種辦法常常稱為進(jìn)程間通訊 (IPC)。其他 IPC 辦法包括管道、音訊隊(duì)列、RPC 和套接字。當(dāng)運(yùn)用需求彼此通訊的應(yīng)用程序的生態(tài)系統(tǒng)時(shí),這種在應(yīng)用程序之間快速、牢靠地交流數(shù)據(jù)的才能十分有用。取決于生態(tài)系統(tǒng)的大小,運(yùn)用數(shù)據(jù)庫(kù)在應(yīng)用程序之間交流信息的常用辦法常常會(huì)招致查詢遲緩,以至 I/O 阻塞。運(yùn)用共享內(nèi)存,沒(méi)有 I/O 會(huì)減緩開(kāi)發(fā)人員的進(jìn)度。

  本文的提議十分簡(jiǎn)單,在網(wǎng)站建設(shè)過(guò)程中學(xué)習(xí)如何運(yùn)用 PHP 創(chuàng)立和操作共享內(nèi)存段,運(yùn)用它們存儲(chǔ)可供其他應(yīng)用程序運(yùn)用的數(shù)據(jù)集。即便沒(méi)有運(yùn)用共享內(nèi)存交流數(shù)據(jù)的方案,它自身也在許多益處,由于它使應(yīng)用程序可以遠(yuǎn)離 I/O 問(wèn)題。將數(shù)據(jù)集直接存儲(chǔ)在內(nèi)存中具有諸多優(yōu)勢(shì),從 Web 效勞數(shù)據(jù)緩存到會(huì)話共享。它是一個(gè)十分有用的概念,每個(gè) PHP 開(kāi)發(fā)人員都應(yīng)該曉得。

  共享內(nèi)存和 PHP

  PHP 具有豐厚的可用擴(kuò)展,共享內(nèi)存也一樣。運(yùn)用一些共享的函數(shù),無(wú)需裝置任何擴(kuò)展,開(kāi)發(fā)人員就可以輕松操作內(nèi)存段。

  回頁(yè)首創(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ù)運(yùn)用。讓我們看看清單 1 中的 shmop_open。

  1. shmop_open 函數(shù)

  <?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)可讀寫的內(nèi)存段

  形式 “c”,它創(chuàng)立一個(gè)新內(nèi)存段,或者假如該內(nèi)存段已存在,嘗試翻開(kāi)它停止讀寫

  形式 “n”,它創(chuàng)立一個(gè)新內(nèi)存段,假如該內(nèi)存段已存在,則會(huì)失敗

  第三個(gè)參數(shù)是內(nèi)存段的權(quán)限。您必需在這里提供一個(gè)八進(jìn)制值。

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

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

  回頁(yè)首向內(nèi)存段寫入數(shù)據(jù)

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

  2. 運(yùn)用 shmop_write 向共享內(nèi)存塊寫入數(shù)據(jù)

  <?php

  $shmid = shmop_open(864, 'c', 0755, 1024);

  shmop_write($shmid, "Hello World!", 0);

  ?>

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

  第一個(gè)參數(shù)是 shmop_open 返回的 ID,它辨認(rèn)您操作的共享內(nèi)存塊。第二個(gè)參數(shù)是您希望存儲(chǔ)的數(shù)據(jù),最后的第三個(gè)參數(shù)是您希望開(kāi)端寫入的位置。默許狀況下,我們一直運(yùn)用 0 來(lái)表示開(kāi)端寫入的位置。請(qǐng)留意,此函數(shù)在失敗時(shí)會(huì)返回 FALSE,在勝利時(shí)會(huì)返回寫入的字節(jié)數(shù)。

  回頁(yè)首從內(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. 運(yùn)用 shmop_read 讀取一個(gè)文件的內(nèi)容

  <?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)容

  <?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)題,由于我們不曉得我們希望讀取幾字節(jié)。

  這十分相似于我們?cè)?fread 函數(shù)中的行為,該函數(shù)承受兩個(gè)參數(shù):翻開(kāi)的流資源(由 fopen 返回)和您希望從該流讀取的字節(jié)數(shù)。運(yùn)用 filesize 函數(shù)(它返回一個(gè)文件中的字節(jié)數(shù))來(lái)完好地讀取它。

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

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

  <?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)、寫入和讀取共享內(nèi)存段。要完成我們的 CRUD 類,我們還需求學(xué)習(xí)如何刪除內(nèi)存段。該任務(wù)可運(yùn)用shmop_delete 函數(shù)輕松完成,該函數(shù)僅承受一個(gè)參數(shù):我們希望刪除的共享內(nèi)存 ID。

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

  <?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)志為刪除,由于共享內(nèi)存段在有其他進(jìn)程正在運(yùn)用它時(shí)無(wú)法被刪除。shmop_delete 函數(shù)將該內(nèi)存段標(biāo)志為刪除,阻止任何其他進(jìn)程翻開(kāi)它。要?jiǎng)h除它,我們需求關(guān)閉該內(nèi)存段。

  回頁(yè)首關(guān)閉內(nèi)存段

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

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

   7. 運(yùn)用 shmop_close 與一個(gè)內(nèi)存段分開(kāi)

  <?php

  $shmid = shmop_open(864, 'c', 0755, 1024);

  shmop_write($shmid, "Hello World!", 0);

  shmop_delete($shmid);

  shmop_close($shmid);

  ?>

  回頁(yè)首運(yùn)用共享內(nèi)存作為一個(gè)存儲(chǔ)選項(xiàng)

  有了共享內(nèi)存和共享內(nèi)存段上根本 CRUD 操作的根本學(xué)問(wèn),是時(shí)分應(yīng)用此學(xué)問(wèn)了。我們能夠運(yùn)用共享內(nèi)存作為一種共同的存儲(chǔ)選項(xiàng),提供快速讀/寫操作和進(jìn)程互操作性等優(yōu)勢(shì)。關(guān)于 Web 應(yīng)用程序,這意味著:

  緩存存儲(chǔ)(數(shù)據(jù)庫(kù)查詢、Web 效勞數(shù)據(jù)、外部數(shù)據(jù))

  會(huì)話存儲(chǔ)

  應(yīng)用程序之間的數(shù)據(jù)交流

  在繼續(xù)之前,我想引見(jiàn)一個(gè)名為 SimpleSHM 小型庫(kù)。SimpleSHM 是一個(gè)較小的籠統(tǒng)層,用于運(yùn)用 PHP 操作共享內(nèi)存,支持以一種面向?qū)ο蟮姆绞捷p松操作內(nèi)存段。在編寫運(yùn)用共享內(nèi)存停止存儲(chǔ)的小型應(yīng)用程序時(shí),這個(gè)庫(kù)可協(xié)助創(chuàng)立十分簡(jiǎn)約的代碼。要理解 SimpleSHM,請(qǐng)?jiān)L問(wèn) GitHub 頁(yè)面。

  您能夠運(yùn)用 3 個(gè)辦法停止處置:讀、寫和刪除。從該類中簡(jiǎn)單地實(shí)例化一個(gè)對(duì)象,能夠控制翻開(kāi)的共享內(nèi)存段。清單 8 展現(xiàn)了根本用處。

  8. SimpleSHM 根本用處

  <?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),供結(jié)構(gòu)函數(shù)翻開(kāi)現(xiàn)有的內(nèi)存段,或者創(chuàng)立一個(gè)具有特定 ID 的內(nèi)存段,如清單 9 所示。

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

  <?php

  $new = new SimpleSHM(897);

  $new->write('Sample');

  echo $new->read();

  ?>

  神奇的辦法 __destructor 擔(dān)任在該內(nèi)存段上調(diào)用 shmop_close 來(lái)取消設(shè)置對(duì)象,以與該內(nèi)存段別離。我們將這稱為 “SimpleSHM 101”。如今讓我們將此辦法用于更高級(jí)的用處:運(yùn)用共享內(nèi)存作為存儲(chǔ)。存儲(chǔ)數(shù)據(jù)集需求序列化,由于數(shù)組或?qū)ο鬅o(wú)法存儲(chǔ)在內(nèi)存中。雖然這里運(yùn)用了 JSON 來(lái)序列化,但任何其他辦法(比方 XML 或內(nèi)置的 PHP 序列化功用)也已足夠。清單 10 給出了一個(gè)示例。

  10. 運(yùn)用共享內(nèi)存作為存儲(chǔ)

  <?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 字符串,并顯現(xiàn)存儲(chǔ)的數(shù)組。這看起來(lái)很簡(jiǎn)單,但請(qǐng)想象一下這個(gè)代碼片段帶來(lái)的可能性。您能夠運(yùn)用它存儲(chǔ) Web 效勞懇求、數(shù)據(jù)庫(kù)查詢或者以至模板引擎緩存的結(jié)果。在內(nèi)存中讀取和寫入將帶來(lái)比在磁盤中讀取和寫入更高的性能。

  運(yùn)用此存儲(chǔ)技術(shù)不只對(duì)緩存有用,也對(duì)應(yīng)用程序之間的數(shù)據(jù)交流也有用,只需數(shù)據(jù)以兩端都可讀的格式存儲(chǔ)。不要低估共享內(nèi)存在 Web 應(yīng)用程序中的力氣??刹捎迷S多不同的方式來(lái)巧妙地完成這種存儲(chǔ),唯一的限制是開(kāi)發(fā)人員的發(fā)明力和技藝。

發(fā)布:2007-03-31 14:48    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
南昌OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普南昌網(wǎng)站建設(shè)公司其他應(yīng)用

南昌OA軟件 南昌OA新聞動(dòng)態(tài) 南昌OA信息化 南昌OA快博 南昌OA行業(yè)資訊 南昌軟件開(kāi)發(fā)公司 南昌門禁系統(tǒng) 南昌物業(yè)管理軟件 南昌倉(cāng)庫(kù)管理軟件 南昌餐飲管理軟件 南昌網(wǎng)站建設(shè)公司