监理公司管理系统 | 工程企业管理系统 | OA系统 | ERP系统 | 造价咨询管理系统 | 工程设计管理系统 | 甲方项目管理系统 | 签约案例 | 客户案例 | 在线试用
X 关闭
南昌网站建设公司

当前位置:工程项目OA系统 > 泛普各地 > 江西OA系统 > 南昌OA系统 > 南昌网站建设公司

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

申请免费试用、咨询电话:400-8352-114

 共享内存是一种在相同机器中的应用程序之间交流数据的有效方式。一个进程可创立一个可供其他进程访问的内存段,只需它分配了正确的权限。每个内存段具有一个唯一的 ID(称为 shmid),这个 ID 指向一个物理内存区域,其他进程可在该区域操作它。创立并提供了适宜的权限之后,同一台机器中的其他进程就能够操作这些内存段:读取、写入和删除。

  这标明运用 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 应用程序中的力气。可采用许多不同的方式来巧妙地完成这种存储,唯一的限制是开发人员的发明力和技艺。

发布:2007-03-31 14:48    编辑:泛普软件 · xiaona    [打印此页]    [关闭]
南昌OA系统
联系方式

成都公司:成都市成华区建设南路160号1层9号

重庆公司:重庆市江北区红旗河沟华创商务大厦18楼

咨询:400-8352-114

加微信,免费获取试用系统

QQ在线咨询

泛普南昌网站建设公司其他应用

南昌OA软件 南昌OA新闻动态 南昌OA信息化 南昌OA快博 南昌OA行业资讯 南昌软件开发公司 南昌门禁系统 南昌物业管理软件 南昌仓库管理软件 南昌餐饮管理软件 南昌网站建设公司