摘要:是用编写的,因此它对系统底层的操作与很像,同大多数语言一样,进程间通信的方式有以下几种消息队列,管道,共享内存,和信号。创建管道创建进程,子进程写管道,父进程读管道通过函数创建一个子进程。当返回时表示创建进程失败。
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! ";运行结果:
create producer progresses: 21432 create producer progresses: 21433 create producer progresses: 21434 create consumer progresses: 21435 (21426) progress create! 2 | consumer(21435) destroy (21424) progress create! 1 | consumer(21436) destroy create 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! ";运行结果:
使用信号量来实现共享内存的锁机制parent progress pid:31720 create 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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/25774.html
摘要:接受不到消息消息队列通过指定而被创建后,任意一方销毁了该队列,都会导致其他发送或接收方失败。用法场景进程,中代码段要用到中代码段的结果。完成了进程间同步问题此外进程间通信采用的方式是共享内存。 参考文章 深刻理解Linux进程间通信(IPC) 进程间通信(IPC)介绍 php高级应用之进程控制及进程间通讯 workman 作者发布 PHP 相关进程间通信扩展 -- System V ...
摘要:多进程通信之一命名管道。多进程通信之三信号量与共享内存。共享内存是最快是进程间通信方式,因为个进程之间并不需要数据复制,而是直接操控同一份数据。的一些书籍中甚至不建议新手轻易使用这种进程间通信的方式,因为这是一种极易产生死锁的解决方案。 [原文地址:https://blog.ti-node.com/blog...] 往往开启多进程的目的是为了一起干活加速效率,前面说了不同进程之间的内存...
摘要:扩展完成兼容机通用如获取进程杀死进程等。扩展实现方式的进程间通信之消息队列。四进程间通信通常中的进程通信方式有消息队列信号量共享内存信号管道。下面这个例子中,父进程等待秒钟,向子进程发送信号。子进程捕获信号,掉信号处理函数处理。 一、引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元。进程对于大多数的语言都不是...
阅读 2272·2021-10-09 09:41
阅读 3131·2021-09-26 09:46
阅读 812·2021-09-03 10:34
阅读 3124·2021-08-11 11:22
阅读 3345·2019-08-30 14:12
阅读 690·2019-08-26 11:34
阅读 3317·2019-08-26 11:00
阅读 1708·2019-08-26 10:26