php操作共用記憶體shmop類及簡單使用測試的代碼

來源:互聯網
上載者:User
這篇文章主要介紹了關於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 應用程式中的力量。可採用許多不同的方式來巧妙地實現這種儲存,惟一的限制是開發人員的創造力和技能。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.