• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php操作共享内存shmop类及简单使用测试(代码)

php 搞代码 3年前 (2022-01-21) 32次浏览 已收录 0个评论

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 = sh<div style="color:transparent">本&文来源gaodai^.ma#com搞#代!码网</div><strong>搞gaodaima代码</strong>mop_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);    }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php操作共享内存shmop类及简单使用测试(代码)
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址