博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP进程间通信
阅读量:6606 次
发布时间:2019-06-24

本文共 2238 字,大约阅读时间需要 7 分钟。

PHP是用C编写的,因此它对系统底层API的操作与C很像,同大多数语言一样,PHP进程间通信的方式有以下几种:消息队列,管道,共享内存,socket和信号。本文是对这几种通信方式对整理:

管道通信PIPE

管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程B从管道P中读取数据。php提供的管道操作API与操作文件的API基本一样,除了创建管道使用posix_mkfifo函数,读写等操作均与文件操作函数相同。当然,你可以直接使用文件模拟管道,但是那样无法使用管道的特性了。

通过管道通信的大概思路是,首先创建一个管道,然后子进程向管道中写入信息,父进程从管道中读取信息,这样就可以做到父子进程直接实现通信了。


消息队列

消息队列是存放在内存中的一种队列数据结构。

0) { unset($childList[$childPid]); }}echo "({$parentPid})main progress end!\n";

运行结果:

create producer progresses: 21432create producer progresses: 21433create producer progresses: 21434create consumer progresses: 21435(21426) progress create! 2 | consumer(21435) destroy(21424) progress create! 1 | consumer(21436) destroycreate consumer progresses: 21436(21426) progress create! 3 | consumer(21436) destroy(21426) progress create! 4 | consumer(21435) destroy(21425) progress create! 3 | consumer(21436) destroy(21424) progress create! 2 | consumer(21435) destroy(21426) progress create! 5 | consumer(21435) destroy(21424) progress create! 3 | consumer(21436) destroy(21433)child progress end!(21425) progress create! 4 | consumer(21435) destroy(21424) progress create! 4 | consumer(21436) destroy(21434)child progress end!(21424) progress create! 5 | consumer(21435) destroy(21425) progress create! 5 | consumer(21436) destroy(21432)child progress end!(21435)child progress end!(21436)child progress end!(21431)main progress end!

信号量与共享内存

0) { unset($childList[$childPid]); }}// 释放共享内存与信号量shm_remove($shareMemory);sem_remove($signal);echo "({$parentPid}) main progress end!\n";

运行结果:

使用信号量来实现共享内存的锁机制

parent progress pid:31720create producer child progress: 31721 create producer child progress: 31722 (31721) count: 0(31721) count: 1(31721) count: 2(31721) count: 3(31721) count: 4(31721) child progress end!create producer child progress: 31723 (31722) count: 5(31722) count: 6(31722) count: 7(31722) count: 8(31722) count: 9(31722) child progress end!(31723) count: 10(31723) count: 11(31723) count: 12(31723) count: 13(31723) count: 14(31723) child progress end!(31720) main progress end!

无锁情况

Warning: sem_release(): SysV semaphore 4357894312 (key 0x73048925) is not currently acquired in /Users/easyboom/www/example/信号量与共享内存.php on line 38

转载地址:http://dfbso.baihongyu.com/

你可能感兴趣的文章
数论 - 欧拉函数模板题 --- poj 2407 : Relatives
查看>>
angular学习笔记(三十)-指令(7)-compile和link(1)
查看>>
Linux Shell文件差集
查看>>
双网卡绑定-bond0
查看>>
JStack分析cpu消耗过高问题
查看>>
[solr] - IKAnalyzer 扩展分词库
查看>>
Mining 影响数据挖掘结果的 5 方面
查看>>
shell脚本执行时报"bad interpreter: Text file busy"的解决方法
查看>>
MVC4 WebAPI
查看>>
同步两台linux服务器时间同步方案
查看>>
RMSE均方根误差学习笔记
查看>>
Rhythmbox乱码的解决的方法
查看>>
应用程序框架实战十:开发环境准备与学习资料清单
查看>>
iOS中拉伸图片的几种方式
查看>>
eclipse中如何去除警告:Class is a raw type. References to generic type Class<T> should be parameterized...
查看>>
Creating Dynamic LOV in Oracle D2k Forms
查看>>
Mysql 数据库字符类型详解
查看>>
Mysql 的位运算符详解,mysql的优先级
查看>>
Gradle脚本基础全攻略
查看>>
Django模版中的过滤器详细解析 Django filter大全
查看>>