|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
培训的第二阶段,开始了PHP语言语法结构和应用的学习。 同享内存是一种在不异机械中的使用法式之间互换数据的无效体例。一个历程可创立一个可供其他历程会见的内存段,只需它分派了准确的权限。每一个内存段具有一个唯一的 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 使用法式中的力气。可采取很多分歧的体例来奇妙地完成这类存储,唯一的限制是开辟人员的发明力和妙技。
不懂的问题有很多高手帮你解决。但不要认为你是新手,就不能帮助别人,比如今天你学会了怎样安装PHP,明天还可能有朋友会问这个问题,你就可以给他解答,不要认为这是浪费时间,忙别人其实就是帮助自己。 |
|