会员登录 | 会员注册 | 意见建议 | 网站地图

站长资源综合门户

当前位置:首页 > 站长学院 > 编程程序 > PHP 直接在共享内存中存储数据集

PHP 直接在共享内存中存储数据集

时间:2012-04-01 18:49:19   作者:   来源:   点击:

回页首从内存段读取数据

从共享内存段读取数据很简单。您只需要一个打开的内存段和 shmop_read 函数。此函数接受一些参数,工作原理类似于 fread。参见清单 3,读取一个 PHP 文件的内容。

清单 3. 使用 shmop_read 读取一个文件的内容

<?php

$stream = fopen('file.txt', 'r+');

fwrite($stream, "Hello World!");

echo fread($stream, 11);

?>

读取共享内存段的内容的过程与此类似,如清单 4 所示:

清单 4. 读取共享内存段的内容

<?php

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

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

echo shmop_read($shmid, 0, 11);

?>

请留意这里的参数。shmop_read 函数将接受 shmop_open 返回的 ID,我们已知道它,不过它还接受另外两个参数。第二个参数是您希望从内存段读取的位置,而第三个是您希望读取的字节数。第二个参数可以始终为 0,表示数据的开头,但第三个参数可能存在问题,因为我们不知道我们希望读取多少字节。

这非常类似于我们在 fread 函数中的行为,该函数接受两个参数:打开的流资源(由 fopen 返回)和您希望从该流读取的字节数。使用 filesize 函数(它返回一个文件中的字节数)来完整地读取它。

幸运的是,当使用共享内存段时,shmop_size 函数返回一个内存段的大小(以字节为单位),类似于 filesize 函数。参见清单 5。

清单 5. shmop_size 函数返回内存段大小,以字节为单位

<?php

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

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

$size = shmop_size($shmid);

echo shmop_read($shmid, 0, $size);

?>

回页首删除内存段

我们学习了如何打开、写入和读取共享内存段。要完成我们的 CRUD 类,我们还需要学习如何删除内存段。该任务可使用shmop_delete 函数轻松完成,该函数仅接受一个参数:我们希望删除的共享内存 ID。

清单 6. shmop_delete 标记要删除的内存段

<?php

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

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

shmop_delete($shmid);

?>

这不会实际删除该内存段。它将该内存段标记为删除,因为共享内存段在有其他进程正在使用它时无法被删除。shmop_delete 函数将该内存段标记为删除,阻止任何其他进程打开它。要删除它,我们需要关闭该内存段。

回页首关闭内存段

打开一个共享内存段会 “附加” 到它。附加该内存段之后,我们可在其中进行读取和写入,但完成操作后,我们必须从它解除。这使用清单 7 中的 shmop_close 函数来完成。

这非常类似于处理文件时的 fclose 函数。打开包含一个文件的流并在其中读取或写入数据后,我们必须关闭它,否则将发生锁定。

清单 7. 使用 shmop_close 与一个内存段分开

<?php

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

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

shmop_delete($shmid);

shmop_close($shmid);

?>

回页首使用共享内存作为一个存储选项

有了共享内存和共享内存段上基本 CRUD 操作的基本知识,是时候应用此知识了。我们可以使用共享内存作为一种独特的存储选项,提供快速读/写操作和进程互操作性等优势。对于 Web 应用程序,这意味着:

缓存存储(数据库查询、Web 服务数据、外部数据)

会话存储

应用程序之间的数据交换

在继续之前,我想介绍一个名为 SimpleSHM 小型库。SimpleSHM 是一个较小的抽象层,用于使用 PHP 操作共享内存,支持以一种面向对象的方式轻松操作内存段。在编写使用共享内存进行存储的小型应用程序时,这个库可帮助创建非常简洁的代码。要了解 SimpleSHM,请访问 GitHub 页面。

您可以使用 3 个方法进行处理:读、写和删除。从该类中简单地实例化一个对象,可以控制打开的共享内存段。清单 8 展示了基本用途。

清单 8. SimpleSHM 基本用途

<?php

$memory = new SimpleSHM;

$memory->write('Sample');

echo $memory->read();

?>

请注意,这里没有为该类传递一个 ID。如果没有传递 ID,它将随机选择一个编号并打开该编号的新内存段。我们可以以参数的形式传递一个编号,供构造函数打开现有的内存段,或者创建一个具有特定 ID 的内存段,如清单 9 所示。

分享到:

阅读此篇文章的网友还阅读了:

  • 2012-03-12网站题目优化直接取得排名的秘密武器
  • 网友评论

    热门编程程序