php进程间通讯
1、进程间通信
前面,我们通过pcntl拓展的创建多个进程来共同完成一个任务。但是进程之间是没有任务交集。
那么,但进程之间需要产生交集时,怎么办?
备注: 这里的交集泛指进程之间的交互,比如抢占资源读写操作等
2、linux系统关于进程间的交互方式
2.1、概要图

2.2、消息队列
- 交互图

- 说明
消息队列在进程间通信充当第三者的角色,强调一方写入、一方读取
2.3、共享内存
- 交互图

- 说明
共享内存在进程间通信充当共有读写资源的角色,多个进程都可以对其进行读写
2.4、信号量
- 交互图

- 说明
信号量是预防资源抢占可能带来的死锁等问题,它强调必须获取信号量的进程,才能对资源进行读写操作。而其它进程则必须等待,直到它获取到信号量为止
2.5、信号
- 交互图

- 说明
信号接收者需要先注册好信号的处理方法
2.6、管道
- 交互图

- 说明
管道相当于在通信进程间安装了出水口,两者通过"这个出水口"进行信息交互
2.7、sockets
- 交互图

- 说明
socket强调的是,网络通信。即这一边的进程通过socket绑定端口,开放服务。另一边的进程这个ip:port的方式,找到这个服务
3、php如何实现进程间通信
php中是以拓展的形式,对上述提到的通信方法进行实现。
- pcntl扩展:主要的进程扩展,完成进程创建于等待操作。
- posix扩展:完成posix兼容机通用api,如获取进程id,杀死进程等。
- sysvmsg扩展:实现system v方式的进程间通信之消息队列。
- sysvsem扩展:实现system v方式的信号量。
- sysvshm扩展:实现system v方式的共享内存。
- sockets扩展:实现socket通信
它们的安装和使用非常简单,在编译 PHP 时添加 --enable-sysvsem --enable-sysvshm --enable-sysvmsg 参数即可