PHP进程通信基础——shmop 、sem系列函数使用
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系列函数使用的更多相关文章
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...
- PHP进程通信基础——信号
PHP进程通信基础--信号 使用信号通信.可以使用kill -l 来查看当前系统的信号类型. 每个信号所代表的的详细含义,请查看我的这篇博客:http://www.cnblogs.com/roverl ...
- PHP进程通信基础——信号量+共享内存通信
PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...
- Linux中exec()执行文件系列函数的使用说明
函数原型: 描述: exec()系列函数使用新的进程映像替换当前进程映像. 工作方式没有什么差别, 只是参数传递的方式不同罢了. 说明: 1. 这6个函数可分为两大类: execl( ...
- 关于getpw系列函数返回的静态区域
首先说一下什么是getpw系列函数,它主要是指这些函数: 这些函数根据一个用户名(getpwnam和getpwnam_r两个函数)或者一个用户ID(getpwuid和getpwuid_r)来获取这个用 ...
- posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...
- UNIX网络编程——epoll 系列函数简介、与select、poll 的区别
前面博客<<UNIX环境高级编程--epoll函数使用详解>>有关于epoll函数的讲解. 一.epoll 系列函数简介 #include <sys/epoll.h> ...
- exec系列函数和system函数
一.exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离.这样的好处是有更多的余地对两种操作进行管理.当我们创建 了一个进程之后,通常将子进程替换成新 ...
- 线程模型、pthread 系列函数 和 简单多线程服务器端程序
一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...
随机推荐
- ES6之字符串扩展方法(常用)
es6这个String对象倒是扩展了不少方法,但是很多都是跟字符编码相关,个人选了几个感觉比较常用的方法: includes 搜索字符的神器 还记得我们之前如何判断某个字符串对象是否包含特地字符的吗? ...
- ViewPager与PagerAdapter
ViewPager是一个可以用来滑动内部View的组件,他有一个老搭档PagerAdapter,我们这次就来看看他们这两位拍档的本事. 我们要使用ViewPager与PagerAdapter结合 首先 ...
- 【代码笔记】iOS-页面调的时候隐藏工具条
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...
- Flash Professional 报错 TypeError: Error #1034: 强制转换类型失败:无法将 xxxx@zzzz 转换为 yyy
通常是因为xxx yyy 两个不同链接名的元件 使用了同一个属性名
- 使用mvn archetype:generate生产maven工程,响应很慢
经常到下列时就不往下走了. 解决方案: 1.不使用interactive mode方式,直接指定DarchetypeArtifactId 2.仍使用interactive mode方式,但增加参数 - ...
- ORACLE 博客文章目录(2015-05-27更新)
从接触ORACLE到深入学习,已有好几年了,虽然写的博客不多,质量也参差不齐,但是,它却是成长的历程的点点滴滴的一个见证,见证了我在这条路上的寻寻觅觅,朝圣的心路历程,现在将ORACLE方面的博客整理 ...
- 初学JavaScript
什么是 JavaScript? JavaScript 被设计用来向 HTML 页面添加交互行为. JavaScript 是一种脚本语言(脚本语言是一种轻量级的编程语言). JavaScript 由数行 ...
- MySQL 5.7.10 自动备份、自动清理旧备份集
http://blog.csdn.net/mchdba/article/details/51527081 MySQL版本是5.7.10-log社区版本,需要进行备份,但是备份时间长了后,磁盘不够用,所 ...
- head/tail实现
只实现了head/tail的基本功能,默认显示十行及-n参数. 一.使用带缓冲的系统调用. write/read等系统调用是不带缓冲的,可以包装一层,使其带缓冲. t ...
- XIB——AutoLayout添加约束
仿QQ登录界面: 说明:以下各图背景红色只是方便看清楚: 1.创建工程:创建xib文件,不会,可看上上上篇:初识xib: 2.打开xib文件: (1).创建头像: 拖控件:uiimageview--& ...