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