PHP 进程间通信---共享内存篇

首先介绍几个函数

1、int ftok ( string pathname, string proj ) :int :生成唯一的key值

* pathname : 任意可访问的路径

* proj : 根据自己的约定,随意设置。这个数字,有的称之为project ID; 在UNIX系统上,它的取值是1到255; 

2、shmop_open ( int $key, string $mode, int  $permissions, int  $size ) : resource    :生成共享内存区域返回一个资源类型

* key : 任意的唯一key值即可 ,这里一般使用ftok 生成的值;

* mode :读取模式 : a - 允许访问只读内存段    ;  w - 允许访问可读写的内存段  ;  c -创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写 模式 “n”,它创建一个新内存段,如果该内存段已存在,则会失败,返回 false,并伴随有warning: unable to attach or create shared memory segment;

* permissions :  内存段的权限。您必须在这里提供一个八进制值,它类似于UNIX操作系统文件和目录的操作权限。

* size : 内存的大小  单位字节;

 

3、shmop_write ( resource $shmid , string $data , int $offset ) : int     :向共享内存中写入数据

* shmid  :  共享内存的资源描述符

* data  : 要写入的内容

* offset : 写入的位置  0表示从开始位置写入;

4、shmop_read(resource $shmid , int $start, int $count) : string       从共享内存中读取数据

* shmid  : 共享内存的资源描述符

* start  : 读取的开始位置  0 表示从头开始

* count :  读取的长度,一般我们采用 shmop_size($shmid) 来读取全部数据

5、shmop_delete(resource $shmid) :bool   :删除共享内存内的内容

* shmid :  共享内存的资源描述符

6、shmop_close (resource $shmid) :void  : 关闭指定共享内存 

* shmid : 共享内存的资源描述符

 

共享内存的原子操作 - 信号控制

针对共享内存的写操作本身不是原子性的,那么当我们大量并发进行读写的时候,怎么保证原子性呢,这里要引入信号量进行控制。

给操作共享内存设置一个权限,每次只有拿到权限的进程才能读取 ,如果当前操作未完成 ,则 后续读取操作等待

我们举一个写入的例子 :

<?php
$shmop=shmop_open($key=ftok(__FILE__,'a'),'c',0755,1024);
//请求对key 的操作权限
$semid=sem_get($key);
//如果获取到权限
if(sem_acquire($semid))
{
    //写入数据
    shmop_write($shmop,'qwewrtr',0);
    //释放权限
    sem_release($semid);
}
echo shmop_read($shmop,0,shmop_size($shmop)).PHP_EOL;
shmop_close($shmop);

 

转载于:https://my.oschina.net/u/4173863/blog/3098646

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值