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. CSS3写折纸

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. animation-timing-function: steps() 详解

    在应用 CSS3 渐变/动画时,有个控制时间的属性 <animation-timing-function> .它的取值中除了常用到的 贝萨尔曲线以外,还有个让人比较困惑的 steps()  ...

  3. GDAL生成Erdas Imagine

    GDAL原生支持超过100种栅格数据类型,涵盖所有主流GIS与RS数据格式,包括•  ArcInfo grids, ArcSDE raster, Imagine, Idrisi, ENVI, GRAS ...

  4. linux查看本机IP、gateway、DNS

    IP:     ifconfig gateway:[root@localhost ~]# netstat -rnKernel IP routing tableDestination     Gatew ...

  5. git+coding.net记录篇

    很久没用了,有些配置快忘记了,记录下来,以供以后参考回忆 首先下载好git插件,然后在as上面设置好本地项目地址 设置好git,点击test测试通过 然后把项目添加到git本地库 你会看到你项目里的文 ...

  6. android 帧动画

    首先在res/drawable/name1.xml/定义一组图片集合: <?xml version="1.0" encoding="utf-8"?> ...

  7. Android开发案例 - 自定义虚拟键盘

    所有包含IM功能的App(如微信, 微博, QQ, 支付宝等)都提供了Emoji表情之类的虚拟键盘,  如下图:    本文只着重介绍如何实现输入法键盘和自定义虚拟键盘的流畅切换, 而不介绍如何实现虚 ...

  8. SQLSERVER基础语句(一)

    1.插入一行数据:INSERT INTO 表名(列名)VALUES(对应的值);2.一次性插入多条数据先建表:INSERT INTO 新建表名(列表)SELECT 原始表列名 FROM 原始表:执行时 ...

  9. 记录一次Quartz2D学习(六)

    (五)内主要讲到了一些图层操作 本次主要讲 图片的裁剪 6图片裁剪 6.1 图片裁剪 TIP: 可能会影响统一图层的显示 - (void)drawRect:(CGRect)rect { CGConte ...

  10. j2ee项目服务器怎样部署?

    1.右击项目  >>  点击如图1中❶  >>  Project(选择项目)  >>  Add  如图1: 图1 2.点击Add  >>  Server ...