首先介绍几个函数
1、intftok( 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 : 共享内存的资源描述符
共享内存的原子操作 - 信号控制
针对共享内存的写操作本身不是原子性的,那么当我们大量并发进行读写的时候,怎么保证原子性呢,这里要引入信号量进行控制。
给操作共享内存设置一个权限,每次只有拿到权限的进程才能读取 ,如果当前操作未完成 ,则 后续读取操作等待
我们举一个写入的例子 :
$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);