php使用-电信ip地址查询-shmop函数创建共享内存减少负载的方法
这篇文章首要介绍了php运用shmop函数创立同享内存减少负载,本文给咱们介绍的十分具体,对咱们的学习或工作具有必定的参考借鉴价值,需求的朋友能够参考下
PHP做内存同享有两套接口。一个是shm,它实践上是变量同享,会把目标变量序列化后再贮存。运用起来倒是挺便利,但是序列化存储对于效率优先的内存拜访操作而言就没啥含义了。别的一个是shmop,它是Linux和Windows通用的,不过功能上比shm弱了一些,在 Linux 上,这些函数直接是经过调用 shm* 系列的函数完成,而 Winodows 上也经过对体系函数的封装完成了相同的调用。
要创立同享内存段需求运用函数shmop,那么前提需求敞开扩展。
shmop首要函数
shmop_open (创立或翻开同享内存块)、shmop_write (向同享内存块中写入数据)、shmop_read (从同享内存块中读取数据)、shmop_size (获取同享内存块的巨细)、shmop_close (封闭同享内存块)、shmop_delete (删去同享内存块)
shmop_open(创立内存段)
该函数中呈现的第一个事物是体系 ID 参数。这是标识体系中的同享内存段的数字。第二个参数是拜访形式,它十分类似于 fopen 函数的拜访形式。您能够在 4 种不同的形式下拜访一个内存段:
形式 “a”,它答应您拜访只读内存段,只读拜访 形式 “c”,它创立一个新内存段,或许假如该内存段已存在,尝试翻开它进行读写
形式 “n”,它创立一个新内存段,假如相同 key 的已存在,则会创立失利,这是为了安全运用同享内存考虑。
第三个参数是内存段的权限。您有必要在这儿供给一个八进制值。
第四个参数供给内存段巨细,以字节为单位。由于运用的同享内存片段是固定长度的,在存储和读取的时分要计算好数据的长度,不然或许会写入失利或许读取空值。。
请注意,此函数回来一个 ID 编号,其他函数可运用该 ID 编号操作该同享内存段。这个 ID 是同享内存拜访 ID,与体系 ID 不同,它以参数的形式传递。请注意不要混杂这两者。假如失利,shmop_open 将回来 FALSE。在创立内存块时主张key参数用常量而不必变量,不然很有或许造成内存走漏。
shmop_write(向内存段写入数据)
这个函数类似于 fwrite 函数,后者有两个参数:翻开的流资源(由 fopen 回来)和您期望写入的数据。shmop_write 函数也执行此使命。
第一个参数是 shmop_open 回来的 ID,它辨认您操作的同享内存块。第二个参数是您期望存储的数据,最后的第三个参数是您期望开端写入的方位。默认情况下,咱们始终运用 0 来表明开端写入的方位。请注意,此函数在失利时会回来 FALSE,在成功时会回来写入的字节数。
shmop_read(从内存段读取数据)
从同享内存段读取数据很简略。您只需求一个翻开的内存段和 shmop_read 函数。此函数接受一些参数,工作原理类似于 fread。
请留意这儿的参数。shmop_read 函数将接受 shmop_open 回来的 ID,咱们已知道它,不过它还接受别的两个参数。第二个参数是您期望从内存段读取的方位,而第三个是您期望读取的字节数。第二个参数能够始终为 0,表明数据的开头,但第三个参数或许存在问题,由于咱们不知道咱们期望读取多少字节。
这十分类似于咱们在 fread 函数中的行为,该函数接受两个参数:翻开的流资源(由 fopen 回来)和您期望从该流读取的字节数。运用 filesize 函数(它回来一个文件中的字节数)来完整地读取它。
shmop_size(回来内存段数据实践巨细)
比如,咱们拓荒了一个长度为100字节的内存空间,但是实践存入的数据长度仅仅90,那么运用shmop_size回来的值便是90.
shmop_delete(删去内存段)
该函数仅接受一个参数:咱们期望删去的同享内存 ID,这不会实践删去该内存段。它将该内存段标记为删去,由于同享内存段在有其他进程正在运用它时无法被删去。shmop_delete 函数将该内存段标记为删去,阻止任何其他进程翻开它。要删去它,咱们需求封闭该内存段。在创立内存块时主张key参数用常量而不必变量,不然很有或许造成内存走漏。
shmop_close(封闭内存段)
咱们在对内存段进行读取和写入,但完成操作后,咱们有必要从它免除,这十分类似于处理文件时的 fclose 函数。翻开包括一个文件的流并在其中读取或写入数据后,咱们有必要封闭它,不然将产生确定。
简略测验成果检查
我是在LNMP环境下操作的,假如你也和我相同,在执行完简略的操作之后,能够运用linux指令检查一下地址和占用巨细
指令说明
key :同享内存的仅有的key值,同享内存经过该key来判断你读取的是哪一块内存。 owner:创立该同享内存块的用户 bytes:该内存块的巨细 status:当时状态,如:dest,即将删去等。
项目实践使用小案例
当然你要考虑的是,假如数据更新的话,那么内存段也要删去,而且更新数据…经过shmop_delete能够删去 。这就需求你们自己电信依据电信ip地址查询项目使用来考虑了
还有便是这篇文章仅仅为了简略的读,并没有呈现复杂的读写,不然或许会呈现进程互斥等意想不到的冲突假如复杂,那么就能够考虑信号量了
共有 0 条评论