PHP进程通信基础——shmop 、sem系列函数使用

PHP进程通信基础——shmop 、sem系列函数使用

进程通信的原理就是在系统中开辟出一个共享区域,不管是管道也好,还是共享内存,都是这个原理。如果心中有了这个概念,就会很方便去理解代码。由于官网上shmop函数的英语解释稍显复杂,所以一边练习,一边简单翻译了下。信号量的内存扩展函数,比较简单,也非常好理解。所以就没有翻译。这篇博客是通信基础,所以直接就放实例代码了,按照上代码上敲一遍,就能够明白个七七八八了。如果实在不明白,可以复制进去,直接打断点调试,也是一种不错的学习思路。

这篇文章参考:

http://php.net/manual/en/ref.sem.php

http://php.net/manual/en/ref.shmop.php

http://www.cnblogs.com/nickbai/articles/6133354.html

1、shmop 系列函数使用

<?php
//使用shmop 系列函数
set_time_limit(0);
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "c", 0655, 1024);
$size = shmop_write($shm_id, "Hello world".PHP_EOL, 0);
shmop_write($shm_id, 'I love you'.PHP_EOL, $size+1);
echo $size.PHP_EOL;
$data = shmop_read($shm_id, 0, 100);
var_dump($data);
shmop_delete($shm_id);
shmop_close($shm_id);

//Shared Memory Functions

/**
* shmop_open(int $key , string $flags , int $mode , int $size)
* $key 共享内存的key
* $flags 的值有以下几种
* a : 创建一个只读的共享内存区。
* c : 如果共享内存区已存在,则打开该共享内存区,并尝试读写。否则新建共享内存区
* w : 创建一个读写共享内存区
* n : 创建一个共享内存区,如果已存在,则返回失败
*
* $mode 读写权限。如0755 0644 等
* $size 申请共享内存区的大小
*/

/**
* shmop_read( resource $shmid , int $start , int $count)
* 将从共享内存块中读取数据
* $shmid 共享内存id,资源类型
* $start 从共享内存的那个字节开始读起
* $count 一次读取多少个字节。
* 如果count值小于发送的信息长度,则信息会被截断。
*/

/**
* shmop_write(resource $shmid , string $data , int $offset)
* 将数据写入共享内存块
* $data 将要写入的数据
* $offset 从共享内存块的那个位置开始写入。
* 该函数的返回值是写入数据的长度。
*/

/**
* shmop_size(resource $shmid);
* 返回当前共享内存块,已经使用的大小
*/

/**
* shmop_delete ( resource $shmid )
* 删除一个共享内存块的,删除引用关系
*/

/**
* shmop_close ( resource $shmid )
* 关闭共享内存块
* 要先使用shmop_delete 之后才能继续使用shmop_close
*/

2、shm 系列函数使用

<?php
//使用信号量扩展共享内存
$key = ftok(__FILE__, 'a');
$share_key = 1;

//创建一个共享内存,大小为1024字节,权限为755
$shm_id = shm_attach($key, 1024, 0755);

//将一个key=>value放进共享内存
$message1 = "I love Roverliang";
shm_put_var($shm_id, $share_key, $message1);

//重复使用key ,前一个设置的值会被后一个设置的值覆盖掉。
$message2 = "I love Rover";
shm_put_var($shm_id, $share_key, $message2);

//读取一个共享内存值
$read_message = shm_get_var($shm_id, $share_key);
echo $read_message.PHP_EOL;

//并不是取走了,而是读取
$read_message2 = shm_get_var($shm_id, $share_key);
echo $read_message2.PHP_EOL;

//判断共享内存中,某个值是否存在
$isexists = shm_has_var($shm_id, $share_key);
var_dump($isexists);

//删除一个值
shm_remove_var($shm_id, $share_key);

//判断共享内存中,某个值是否存在
$isexists = shm_has_var($shm_id, $share_key);
var_dump($isexists);

//删除一个共享内存
shm_remove($shm_id);

//关闭共享内存的连接
shm_detach($shm_id);

PHP进程通信基础——shmop 、sem系列函数使用的更多相关文章

  1. linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  2. PHP进程通信基础——信号

    PHP进程通信基础--信号 使用信号通信.可以使用kill -l 来查看当前系统的信号类型. 每个信号所代表的的详细含义,请查看我的这篇博客:http://www.cnblogs.com/roverl ...

  3. PHP进程通信基础——信号量+共享内存通信

    PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...

  4. Linux中exec()执行文件系列函数的使用说明

    函数原型: 描述:    exec()系列函数使用新的进程映像替换当前进程映像.    工作方式没有什么差别, 只是参数传递的方式不同罢了. 说明:    1. 这6个函数可分为两大类: execl( ...

  5. 关于getpw系列函数返回的静态区域

    首先说一下什么是getpw系列函数,它主要是指这些函数: 这些函数根据一个用户名(getpwnam和getpwnam_r两个函数)或者一个用户ID(getpwuid和getpwuid_r)来获取这个用 ...

  6. posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

    posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...

  7. UNIX网络编程——epoll 系列函数简介、与select、poll 的区别

    前面博客<<UNIX环境高级编程--epoll函数使用详解>>有关于epoll函数的讲解. 一.epoll 系列函数简介 #include <sys/epoll.h> ...

  8. exec系列函数和system函数

    一.exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离.这样的好处是有更多的余地对两种操作进行管理.当我们创建 了一个进程之后,通常将子进程替换成新 ...

  9. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...

随机推荐

  1. FineReport制作可动态展开的组织递归树报表

    先看看效果: 报表软件:FineReport 1.分析-与正常查询的对比 如果不做这种树状结构展开的报表的话,正常的SQL应该是这样写的,以单据表为例,假设单据的机构为分公司,经营部 select 分 ...

  2. GO 1.5 代码编译安装 [centos7 64位]

    2015年8月,Go 1.5 正式发布,这是 Go 的第六个重要版本. 此版本包括大量重大改进,编译工具链从 C 转换到 Go,从 Go 代码库中完全移除 C 代码.完完全全重新设计了垃圾收集器,减少 ...

  3. Android InputType详解

    android:inputType 如果设置android:inputType = "number",则默认弹出的输入键盘为数字键盘,且输入的内容只能为数字. InputType文 ...

  4. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  5. vs2010中如何设置Visual Assist方便地使用现成的代码编辑器风格

    风格setting可以在下面网站上获取: http://studiostyl.es/ 在VS2010+VA直接使用会有2个显著的问题: 1,有些符号颜色太深,与黑色背景几乎融为一体: 2,光标落入大小 ...

  6. SQLServer中Partition By 函数的使用

    今天群里看到一个问题,在这里概述下:查询出不同分类下的最新记录.一看这不是很简单的么,要分类那就用Group By;要最新记录就用Order By呗.然后在自己的表中试着做出来: 首先呢我把表中的数据 ...

  7. Linux(Unix)时钟同步ntpd服务配置方法

    http://xu20cn.blog.51cto.com/274020/69689 假定时钟服务器IP地址为:192.168.0.1 服务器端配置: 1:置/etc/ntp.conf文件内容为: se ...

  8. [转]An introduction to OAuth 2.0 using Facebook in ASP.NET Core

    本文转自:http://andrewlock.net/an-introduction-to-oauth-2-using-facebook-in-asp-net-core/ This is the ne ...

  9. 安装Windows更新程序遇到错误:0x80070422

    看看服务那里 windows update服务是不是被禁用了? 还有一个问题可能是由于Windows Modules Installer被禁用了.

  10. libsvm的数据格式及制作

    1.libsvm数据格式 libsvm使用的训练数据和检验数据文件格式如下: [label] [index1]:[value1] [index2]:[value2] … [label] [index1 ...