php操作共享記憶體shmop類別及簡單使用測試(程式碼)
SimpleSHM 是一个较小的抽象层,用于使用 PHP 操作共享内存,支持以一种面向对象的方式轻松操作内存段。在编写使用共享内存进行存储的小型应用程序时,这个库可帮助创建非常简洁的代码。可以使用 3 个方法进行处理:读、写和删除。从该类中简单地实例化一个对象,可以控制打开的共享内存段。
类对象和测试代码
<?php //类对象 namespace Simple\SHM; class Block { /** * Holds the system id for the shared memory block * * @var int * @access protected */ protected $id; /** * Holds the shared memory block id returned by shmop_open * * @var int * @access protected */ protected $shmid; /** * Holds the default permission (octal) that will be used in created memory blocks * * @var int * @access protected */ protected $perms = 0644; /** * Shared memory block instantiation * * In the constructor we'll check if the block we're going to manipulate * already exists or needs to be created. If it exists, let's open it. * * @access public * @param string $id (optional) ID of the shared memory block you want to manipulate */ public function __construct($id = null) { if($id === null) { $this->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); } }
<?php //测试使用代码 namespace Simple\SHM\Test; use Simple\SHM\Block; class BlockTest extends \PHPUnit_Framework_TestCase { public function testIsCreatingNewBlock() { $memory = new Block; $this->assertInstanceOf('Simple\\SHM\\Block', $memory); $memory->write('Sample'); $data = $memory->read(); $this->assertEquals('Sample', $data); } public function testIsCreatingNewBlockWithId() { $memory = new Block(897); $this->assertInstanceOf('Simple\\SHM\\Block', $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('Simple\\SHM\\Block', $memory); $memory->write('Sample 3'); unset($memory); $memory = new Block; $data = $memory->read(); $this->assertEquals('Sample 3', $data); } }
额外说明
<?php $memory = new SimpleSHM; $memory->write('Sample'); echo $memory->read(); ?>
请注意,上面代码里没有为该类传递一个 ID。如果没有传递 ID,它将随机选择一个编号并打开该编号的新内存段。我们可以以参数的形式传递一个编号,供构造函数打开现有的内存段,或者创建一个具有特定 ID 的内存段,如下
<?php $new = new SimpleSHM(897); $new->write('Sample'); echo $new->read(); ?>
神奇的方法 __destructor 负责在该内存段上调用 shmop_close 来取消设置对象,以与该内存段分离。我们将这称为 “SimpleSHM 101”。现在让我们将此方法用于更高级的用途:使用共享内存作为存储。存储数据集需要序列化,因为数组或对象无法存储在内存中。尽管这里使用了 JSON 来序列化,但任何其他方法(比如 XML 或内置的 PHP 序列化功能)也已足够。如下
<?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操作共享記憶體shmop類別及簡單使用測試(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
