摘要:是一個(gè)較小的抽象層,用于使用操作共享內(nèi)存,支持以一種面向?qū)ο蟮姆绞捷p松操作內(nèi)存段。在編寫(xiě)使用共享內(nèi)存進(jìn)行存儲(chǔ)的小型應(yīng)用程序時(shí),這個(gè)庫(kù)可幫助創(chuàng)建非常簡(jiǎn)潔的代碼。不要低估共享內(nèi)存在應(yīng)用程序中的力量。
SimpleSHM 是一個(gè)較小的抽象層,用于使用 PHP 操作共享內(nèi)存,支持以一種面向?qū)ο蟮姆绞捷p松操作內(nèi)存段。在編寫(xiě)使用共享內(nèi)存進(jìn)行存儲(chǔ)的小型應(yīng)用程序時(shí),這個(gè)庫(kù)可幫助創(chuàng)建非常簡(jiǎn)潔的代碼。可以使用 3 個(gè)方法進(jìn)行處理:讀、寫(xiě)和刪除。從該類(lèi)中簡(jiǎn)單地實(shí)例化一個(gè)對(duì)象,可以控制打開(kāi)的共享內(nèi)存段。
類(lèi)對(duì)象和測(cè)試代碼
id = $this->generateID(); } else { $this->id = $id; } if($this->exists($this->id)) { $this->shmid = shmop_open($this->id, "w", 0, 0); } } /** * Generates a random ID for a shared memory block * * @access protected * @return int System V IPC key generated from pathname and a project identifier */ protected function generateID() { $id = ftok(__FILE__, "b"); return $id; } /** * Checks if a shared memory block with the provided id exists or not * * In order to check for shared memory existance, we have to open it with * reading access. If it doesn"t exist, warnings will be cast, therefore we * suppress those with the @ operator. * * @access public * @param string $id ID of the shared memory block you want to check * @return boolean True if the block exists, false if it doesn"t */ public function exists($id) { $status = @shmop_open($id, "a", 0, 0); return $status; } /** * Writes on a shared memory block * * First we check for the block existance, and if it doesn"t, we"ll create it. Now, if the * block already exists, we need to delete it and create it again with a new byte allocation that * matches the size of the data that we want to write there. We mark for deletion, close the semaphore * and create it again. * * @access public * @param string $data The data that you wan"t to write into the shared memory block */ public function write($data) { $size = mb_strlen($data, "UTF-8"); if($this->exists($this->id)) { shmop_delete($this->shmid); shmop_close($this->shmid); $this->shmid = shmop_open($this->id, "c", $this->perms, $size); shmop_write($this->shmid, $data, 0); } else { $this->shmid = shmop_open($this->id, "c", $this->perms, $size); shmop_write($this->shmid, $data, 0); } } /** * Reads from a shared memory block * * @access public * @return string The data read from the shared memory block */ public function read() { $size = shmop_size($this->shmid); $data = shmop_read($this->shmid, 0, $size); return $data; } /** * Mark a shared memory block for deletion * * @access public */ public function delete() { shmop_delete($this->shmid); } /** * Gets the current shared memory block id * * @access public */ public function getId() { return $this->id; } /** * Gets the current shared memory block permissions * * @access public */ public function getPermissions() { return $this->perms; } /** * Sets the default permission (octal) that will be used in created memory blocks * * @access public * @param string $perms Permissions, in octal form */ public function setPermissions($perms) { $this->perms = $perms; } /** * Closes the shared memory block and stops manipulation * * @access public */ public function __destruct() { shmop_close($this->shmid); } }
assertInstanceOf("SimpleSHMBlock", $memory); $memory->write("Sample"); $data = $memory->read(); $this->assertEquals("Sample", $data); } public function testIsCreatingNewBlockWithId() { $memory = new Block(897); $this->assertInstanceOf("SimpleSHMBlock", $memory); $this->assertEquals(897, $memory->getId()); $memory->write("Sample 2"); $data = $memory->read(); $this->assertEquals("Sample 2", $data); } public function testIsMarkingBlockForDeletion() { $memory = new Block(897); $memory->delete(); $data = $memory->read(); $this->assertEquals("Sample 2", $data); } public function testIsPersistingNewBlockWithoutId() { $memory = new Block; $this->assertInstanceOf("SimpleSHMBlock", $memory); $memory->write("Sample 3"); unset($memory); $memory = new Block; $data = $memory->read(); $this->assertEquals("Sample 3", $data); } }
額外說(shuō)明
write("Sample"); echo $memory->read(); ?>
請(qǐng)注意,上面代碼里沒(méi)有為該類(lè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)存段,如下
write("Sample"); echo $new->read(); ?>
神奇的方法 __destructor 負(fù)責(zé)在該內(nèi)存段上調(diào)用 shmop_close 來(lái)取消設(shè)置對(duì)象,以與該內(nèi)存段分離。我們將這稱(chēng)為 “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 序列化功能)也已足夠。如下
"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)造力和技能。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/61998.html
摘要:是一個(gè)較小的抽象層,用于使用操作共享內(nèi)存,支持以一種面向?qū)ο蟮姆绞捷p松操作內(nèi)存段。在編寫(xiě)使用共享內(nèi)存進(jìn)行存儲(chǔ)的小型應(yīng)用程序時(shí),這個(gè)庫(kù)可幫助創(chuàng)建非常簡(jiǎn)潔的代碼。不要低估共享內(nèi)存在應(yīng)用程序中的力量。 SimpleSHM 是一個(gè)較小的抽象層,用于使用 PHP 操作共享內(nèi)存,支持以一種面向?qū)ο蟮姆绞捷p松操作內(nèi)存段。在編寫(xiě)使用共享內(nèi)存進(jìn)行存儲(chǔ)的小型應(yīng)用程序時(shí),這個(gè)庫(kù)可幫助創(chuàng)建非常簡(jiǎn)潔的代碼。可以...
摘要:請(qǐng)注意,此函數(shù)返回一個(gè)編號(hào),其他函數(shù)可使用該編號(hào)操作該共享內(nèi)存段。從內(nèi)存段讀取數(shù)據(jù)從共享內(nèi)存段讀取數(shù)據(jù)很簡(jiǎn)單。函數(shù)將該內(nèi)存段標(biāo)記為刪除,阻止任何其他進(jìn)程打開(kāi)它。 在之前的一篇博客[了解一下共享內(nèi)存的概念及優(yōu)缺點(diǎn)]已經(jīng)對(duì)共享內(nèi)存的概念做了說(shuō)明。下面就來(lái)簡(jiǎn)單使用共享內(nèi)存(其實(shí)也可以用其他工具,比如redis) PHP做內(nèi)存共享有兩套接口。一個(gè)是shm,它實(shí)際上是變量共享,會(huì)把對(duì)象變量序列化...
摘要:請(qǐng)注意,此函數(shù)返回一個(gè)編號(hào),其他函數(shù)可使用該編號(hào)操作該共享內(nèi)存段。從內(nèi)存段讀取數(shù)據(jù)從共享內(nèi)存段讀取數(shù)據(jù)很簡(jiǎn)單。函數(shù)將該內(nèi)存段標(biāo)記為刪除,阻止任何其他進(jìn)程打開(kāi)它。 在之前的一篇博客[了解一下共享內(nèi)存的概念及優(yōu)缺點(diǎn)]已經(jīng)對(duì)共享內(nèi)存的概念做了說(shuō)明。下面就來(lái)簡(jiǎn)單使用共享內(nèi)存(其實(shí)也可以用其他工具,比如redis) PHP做內(nèi)存共享有兩套接口。一個(gè)是shm,它實(shí)際上是變量共享,會(huì)把對(duì)象變量序列化...
閱讀 955·2023-04-25 23:54
閱讀 3036·2021-11-08 13:21
閱讀 3759·2021-09-27 13:35
閱讀 3381·2021-07-26 23:41
閱讀 1042·2019-08-30 15:52
閱讀 3431·2019-08-30 11:27
閱讀 2087·2019-08-29 18:37
閱讀 528·2019-08-29 17:24