Memcache缓存实例的PHP实现
总结共享内存是在同一台机床上应用程序之间交换数据的一种有效方法。一个进程可以创建一个内存段可以访问其他进程只要分配合适的权限。每个内存段都有一个唯一的ID(称为shmid),它指向一个物理内存区域,和其他进程可以操作它在那个地区。在创建和提供相应的权限,在同一台机器上的其他进程可以操作的内存段:读,写和删除。
这表明,用C语言编写的应用程序可以用其他语言如java或PHP应用程序共享信息。他们都能分享信息,只要他们能够理解和访问信息,共享内存被广泛应用在大多数语言中的实现,所以访问应该不成问题。了解信息,我们可以使用一个标准的格式,如XML或JSON。
使用共享内存之间的数据交换过程是一个快速的方法,主要是因为数据在内存创建段通过,和核不参与。这种方法通常被称为进程间通信(IPC)。其他IPC方法包括管道、消息队列、RPC和插座的能力迅速。交换数据和可靠的应用程序之间使用一个生态系统是非常有用的,需要互相交流的时候。这取决于生态系统的大小,常用的方法,利用数据库之间交换信息的应用程序往往会导致查询速度慢、甚至我 / O阻塞。使用共享内存,没有我/ O,放慢开发进度。
在这篇文章中的建议是非常简单的学习如何创建和使用共享内存段使用PHP和使用它们来存储,可以被其他应用程序使用的数据集。即使没有打算与共享内存交换数据,这本身就是一个很大的好处,因为它允许应用程序可以远离我 / O的问题。它已存储数据集直接在内存中缓存的优点,从Web服务的数据会话共享。这是一个非常有用的概念,一个PHP开发者应该知道。
共享内存和PHP
PHP有丰富的可用扩展,而共享内存是相同的。
创建内存段
共享内存的功能类似于文件操作函数,但没有处理流,你将处理共享内存访问ID的第一个例子是shmop_open功能,它允许您打开一个现有的内存段或创建一个新的内存段。这个功能是经典的fopen函数非常相似,这为文件操作打开流,并返回一个资源等功能,我们要读取或写入流开。让我们看一看清单1中的shmop_open。
清单1。shmop_open功能
复制代码代码如下所示:
< PHP
systemid美元= 864; / /系统ID为共享内存段
$;访问模式
$ = 0755;共享内存段的权限
段的大小= 1024;大小为字节。
美元shmop_open shmid =(systemid美元,美元美元美元模式、权限、大小);
>
出现在这个函数的第一件事就是系统ID参数。这是在识别系统的共享内存段的数目。二参数的访问模式,这对fopen函数的访问模式非常相似。你可以在4种不同的内存段的访问:
模式A,它允许你访问只读内存段。
模式w,它允许您访问可读的和写的内存段。
模式C,它创建一个新的内存段,或者如果内存段已经存在,试着打开它来读和写。
模式N,如果内存段已经存在,则创建一个新的内存段失败。
第三个参数是内存段的权限,您必须在这里提供八进制值。
这第四个参数以字节为单位提供内存段的大小。在编写内存段之前,必须为其分配适当的字节数。
注意,这个函数返回一个ID号,而其他功能可以用身份证号码来操作共享内存段。这个ID是一个共享内存访问的ID,这是不同于系统ID,这是一个参数的形式通过。请注意不要将两者混为一谈。如果失败,shmop_open将返回错误。
将数据写入内存段
使用shmop_write函数将数据写入共享内存块。这个函数的使用是很简单的。它只接受3个参数,如清单2所示。
清单2。使用shmop_write写数据到共享内存块
复制代码代码如下所示:
< PHP
美元shmop_open shmid =(864,C,0755, 1024);
shmop_write($ shmid,你好世界!
>
这个功能类似于文件的功能,它有两个参数:开流资源(fopen返回的),你要写的数据,shmop_write功能也执行此任务。
第一个参数是返回的ID标识的shmop_open,共享内存块,你操作的第二个参数是你要存储的数据,和最后第三个参数是你要开始写作的地方。默认情况下,我们总是用0来表示开始写作的位置。注意,此功能返回FALSE时失败,并返回写成功案例的字节数。
从内存段读取数据
从一个共享内存段的阅读数据很简单,你只需要一个开放的内存段和shmop_read函数,这个函数接受一些参数和工作原理类似于清单3中,读到一个PHP文件的内容。
清单3。读一个文件用shmop_read内容
复制代码代码如下所示:
< PHP
$流= fopen(文件.txt,R +);
fwrite(合流,你好世界!;
回声fread(合流,11);
>
读取共享内存段内容的过程与此类似,如清单4所示。
清单4。读取共享内存段的内容
复制代码代码如下所示:
< PHP
美元shmop_open shmid =(864,C,0755, 1024);
shmop_write($ shmid,你好世界!
回声shmop_read(shmid美元,0, 11);
>
请注意这里的参数,shmop_read函数将接受身份返回shmop_open,这我们已经知道,但它也可以接受两个其他参数。第二个参数是要从内存段的阅读位置,而第三是字节你想读第二参数数量。可以0,表示数据的开始,但第三参数可能有一些问题,因为我们不知道我们要读多少字节。
这是对我们的行为非常类似于fread函数,它的参数有两个:开流资源(fopen返回的字节),你想从流中读取数。使用文件大小的功能(它返回一个文件的字节数)读完全。
幸运的是,当共享内存段的使用,shmop_size函数返回的内存段的大小(以字节为单位),类似于清单5文件大小功能。
清单5。的shmop_size函数返回的内存段的大小,以字节为单位
复制代码代码如下所示:
< PHP
美元shmop_open shmid =(864,C,0755, 1024);
shmop_write($ shmid,你好世界!
大小= shmop_size美元(约合shmid);
回声shmop_read($ 0,$ shmid,大小);
>
回到顶部
删除记忆片段
我们学会了如何打开、读写、共享内存段。完成我们的增删改查课,我们还需要了解如何删除内存段。这个任务很容易完成的shmop_delete功能,只接受一个参数:共享内存ID我们想删除。
清单6。shmop_delete标签删除记忆的片段
复制代码代码如下所示:
< PHP
美元shmop_open shmid =(864,C,0755, 1024);
shmop_write($ shmid,你好世界!
shmop_delete($ shmid);
>
这实际上并没有删除内存段。它标志着记忆的片段删除因为共享内存段不能被删除,当其他进程正在使用它,shmop_delete函数标记为删除的内存段,以防止其他进程打开它,删除它,我们需要关闭内存段。
关闭内存段
打开一个共享内存段将连接到它。附加内存段后,我们可以读写,但手术后,我们要将它从它。这是使用清单7中的shmop_close功能。
这是在关闭文件函数非常相似,当处理文件。打开一个流包含文件的读或写数据后,我们必须关闭它,否则会出现锁。
清单7。使用shmop_close从一个内存段的分离
复制代码代码如下所示:
< PHP
美元shmop_open shmid =(864,C,0755, 1024);
shmop_write($ shmid,你好世界!
shmop_delete($ shmid);
shmop_close($ shmid);
>
使用共享内存作为存储选项
对共享内存的基本的CRUD操作的基本知识和共享内存段,它的时间来应用这些知识。我们可以使用共享内存作为一种独特的存储选项,提供快速的读/写操作和过程的互操作性。对于Web应用程序,这意味着:
缓存存储(数据库查询、Web服务数据、外部数据)
会话存储
应用程序之间的数据交换
我走之前,我想介绍一个小simpleshm library.simpleshm是一种利用PHP操作共享内存小的抽象层,使操作方便记忆片段在一个面向对象的方式。在小型的应用程序中使用共享内存存储,这可以帮助创建一个非常简单的代码,了解simpleshm,请访问GitHub页面。
你可以用3种方法处理:读,写,删除,打开共享内存段可以通过简单地实例化对象的类控制,清单8显示了基本的使用。
清单8。simpleshm基本用途
复制代码代码如下所示:
< PHP
记忆=新simpleshm美元;
$记忆->写('sample);
内存(>读());
>
请注意,这个类没有ID。如果id未通过,它会随机选择一个数字并打开新的内存段。我们可以以参数的形式传递一个数字,让构造函数打开现有的内存段,或者创建一个具有特定id的内存段,如清单9所示。
清单9。打开特定内存段
复制代码代码如下所示:
< PHP
新=新simpleshm美元(897);
新的美元->写('sample);
新(>);
>
神奇的方法,__destructor,负责召集shmop_close对内存段取消集对象从内存段分开。我们称这种simpleshm 101。现在让我们用这种方法更先进的使用:使用共享内存作为存储,存储的数据集需要被序列化,因为数组或对象不能被存储在存储器中。虽然这里使用JSON序列化,其他方法(如XML或内置的PHP序列化功能)是足够的。清单10给出了一个例子。
清单10。使用共享内存作为存储
复制代码代码如下所示:
< PHP
要求('simpleshm。类。php);
结果=数组(
用户= >约翰,
密码=>为123456,
岗位= >阵列(我的名字是约翰,我不叫约翰)
);
数据json_encode美元($结果);
记忆=新simpleshm美元;
$内存>写入($数据);
storedarray美元= json_decode($内存>阅读());
print_r($ storedarray);
>
我们成功地将一个数组成json字符串,将其存储在共享内存块,从中读取数据,序列化的JSON字符串,并显示存储阵列。它看起来很简单,但是想象一下该代码段的可能性,你可以使用它来存储Web服务请求的结果,一个数据库查询,甚至一个模板引擎缓存。读写内存会带来比读写磁盘的高性能。
使用这种存储技术不仅可以用于缓存,但也有用的应用程序之间的数据交换,只要数据是存储在两端在一个可读的格式。不要低估了共享内存的能力的Web应用程序。这种存储可以以许多不同的方式巧妙地实现,唯一的限制是开发商的创造力和技能