PHP在共享内存中存储数据集
这标明运用 C 言语编写的应用程序可与运用其他言语(比方 Java™ 或 PHP)编写的应用程序共享信息。它们都能够共享信息,只需它们可访问和了解该信息。共享内存在针对大局部言语的完成中得到了普遍运用,所以访问应该不是问题。要了解信息,我们能够运用一种规范格式,比方 XML 或 JSON。
共享内存的运用是一种在进程之间交流数据的快速办法,主要由于在创立内存段之后传送数据,不会触及内核。这种办法常常称为进程间通讯 (IPC)。其他 IPC 办法包括管道、音讯队列、RPC 和套接字。当运用需求彼此通讯的应用程序的生态系统时,这种在应用程序之间快速、牢靠地交流数据的才能十分有用。取决于生态系统的大小,运用数据库在应用程序之间交流信息的常用办法常常会招致查询迟缓,以至 I/O 阻塞。运用共享内存,没有 I/O 会减缓开发人员的进度。
本文的提议十分简单,在网站建设过程中学习如何运用 PHP 创立和操作共享内存段,运用它们存储可供其他应用程序运用的数据集。即便没有运用共享内存交流数据的方案,它自身也在许多益处,由于它使应用程序可以远离 I/O 问题。将数据集直接存储在内存中具有诸多优势,从 Web 效劳数据缓存到会话共享。它是一个十分有用的概念,每个 PHP 开发人员都应该晓得。
共享内存和 PHP
PHP 具有丰厚的可用扩展,共享内存也一样。运用一些共享的函数,无需装置任何扩展,开发人员就可以轻松操作内存段。
回页首创立内存段
共享内存函数相似于文件操作函数,但无需处置一个流,您将处置一个共享内存访问 ID。第一个示例就是 shmop_open 函数,它允许您翻开一个现有的内存段或创立一个新内存段。此函数十分相似于经典的 fopen 函数,后者翻开用于文件操作的流,返回一个资源供其他希望读取或写入该翻开的流的函数运用。让我们看看清单 1 中的 shmop_open。
1. shmop_open 函数
<?php
$systemid = 864; // System ID for the shared memory segment
$mode = "c"; // Access mode
$permissions = 0755; // Permissions for the shared memory segment
$size = 1024; // Size, in bytes, of the segment
$shmid = shmop_open($systemid, $mode, $permissions, $size);
?>
该函数中呈现的第一个事物是系统 ID 参数。这是标识系统中的共享内存段的数字。第二个参数是访问形式,它十分相似于 fopen 函数的访问形式。您能够在 4 种不同的形式下访问一个内存段:
形式 “a”,它允许您访问只读内存段
形式 “w”,它允许您访问可读写的内存段
形式 “c”,它创立一个新内存段,或者假如该内存段已存在,尝试翻开它停止读写
形式 “n”,它创立一个新内存段,假如该内存段已存在,则会失败
第三个参数是内存段的权限。您必需在这里提供一个八进制值。
第四个参数提供内存段大小,以字节为单位。在写入一个内存段之前,您必需在它之上分配恰当的字节数。
请留意,此函数返回一个 ID 编号,其他函数可运用该 ID 编号操作该共享内存段。这个 ID 是共享内存访问 ID,与系统 ID 不同,它以参数的方式传送。请留意不要混杂这两者。假如失败,shmop_open 将返回 FALSE。
回页首向内存段写入数据
运用 shmop_write 函数向共享内存块写入数据。此函数的运用很简单,它仅承受 3 个参数,如清单 2 所示。
2. 运用 shmop_write 向共享内存块写入数据
<?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
?>
这个函数相似于 fwrite 函数,后者有两个参数:翻开的流资源(由 fopen 返回)和您希望写入的数据。shmop_write 函数也执行此任务。
第一个参数是 shmop_open 返回的 ID,它辨认您操作的共享内存块。第二个参数是您希望存储的数据,最后的第三个参数是您希望开端写入的位置。默许状况下,我们一直运用 0 来表示开端写入的位置。请留意,此函数在失败时会返回 FALSE,在胜利时会返回写入的字节数。
回页首从内存段读取数据
从共享内存段读取数据很简单。您只需求一个翻开的内存段和 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 所示。
9. 翻开一个特定的内存段
<?php
$new = new SimpleSHM(897);
$new->write('Sample');
echo $new->read();
?>
神奇的办法 __destructor 担任在该内存段上调用 shmop_close 来取消设置对象,以与该内存段别离。我们将这称为 “SimpleSHM 101”。如今让我们将此办法用于更高级的用处:运用共享内存作为存储。存储数据集需求序列化,由于数组或对象无法存储在内存中。虽然这里运用了 JSON 来序列化,但任何其他办法(比方 XML 或内置的 PHP 序列化功用)也已足够。清单 10 给出了一个示例。
10. 运用共享内存作为存储
<?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 应用程序中的力气。可采用许多不同的方式来巧妙地完成这种存储,唯一的限制是开发人员的发明力和技艺。
- 1早上泡脚,使得人们更好的排毒
- 2在一定时间内使冷水温度升高变成热水一种装置
- 3 基础PHP小知识分享
- 4消费者在选购空调时应综合考虑以下因素
- 5优惠活动—为您保驾护航,减少创业风险!
- 6义乌华睿管理软件ERP系统实施执行力下降原因
- 7服装行业ERP管理软件选型应同时遵循的六大原则
- 8南昌网站建设介绍新站SEO的注意事项
- 9网站建设中的用户体验
- 10ERP管理软件华睿公司能为您解决的
- 11新手站长换友链需要注意的
- 12JavaScript中window.event对象
- 13电子邮件加密传输
- 14如何正确选择虚拟主机租用托管服务商
- 15网站优化粘度应考虑需求与欲望
- 16双线虚拟主机开展应用的4个方式
- 17优秀的OA软件应具备的五大特性
- 18准确选择IDC机房主机托管服务
- 19b2c网上商城解决方案
- 20域名的作用
- 21如何寻找适合自己的外贸ERP管理系统
- 22如何选择虚拟主机?
- 23php程序中需要用到的C代码
- 24义乌软件定制开发产品功能仍是OA成败重要因素
- 25如何挑选适合自己的个性创意域名
- 26PHP集成开发工具(IDE)的比较
- 27网站建设公司分析“几大”采纳经历分析
- 28抢注域名要注意那些事项?
- 29合肥最好的网络公司告诉大家快速提高网站权重
- 30泛普软件祝贺PHP DataGrid 4.5 成功发布