[TOC]
# 进程通信
******
在各个进程中,内存空间都是不一致的,各个变量都是在不同的内如空间,举个简单的例子:
> 用户 A 访问服务端,$_SESSION['user'] = 1;
> 用户 B 同时访问服务端,读取$_SESSION['user']是读取不到的,因为进程之间内存不是相同的。
同时,在 php 多进程中,pcntl_fork 之后,虽然能读取到之前的变量,但这个变量是复制出来的一份,和原来那份存储位置根本不同,例如:
```php
<?php
$str = "EasySwoole\n";
$pid = pcntl_fork();
if ($pid > 0) {
$str = 'huanghui\n'; // 在主进程修改了$str,不会影响到子进程的$str变量
echo $str;
} elseif ($pid == 0) {
echo $str; // $str 是 pcntl_fork复制出来的
} else {
}
```
所以,多进程中根本无法直接通信,那么,该怎么样才能通信呢?可以使用以下几种方式进行通信:
* 管道通信,分为有名管道、无名管道等,可自行搜索了解详细。
* 消息队列通信,使用 linux 消息队列,通过 sysvmsg 扩展,可查看:[php进程通信-消息队列](http://blog.huanghui.xyz/2019/12/16/Swoole/Swoole%E5%9F%BA%E7%A1%80/php%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/)
* 进程信号通信,可查看:[php进程通信-进程信号](http://blog.huanghui.xyz/2019/12/24/Swoole/Swoole%E5%9F%BA%E7%A1%80/php%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1-%E8%BF%9B%E7%A8%8B%E4%BF%A1%E5%8F%B7/)
* 共享内存通信,映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
* 套接字通信
* 第三方通信,使用文件操作,mysql,redis等方法也可以实现通信。
可自行搜索了解详细内容。
- 引言
- Introduction
- 运行模式
- php-fpm
- php-cli
- 基础介绍
- 网络协议
- ip
- tcp
- tcp
- http
- webSocket
- udp
- port端口
- 会话管理
- cookie
- session
- api/token
- linux基础
- lnmp安装
- 命令
- 进程管理
- 扩展安装
- 端口监控
- 防火墙说明
- php7.0
- 部分新特性
- php回调/闭包
- 回调事件
- 闭包/匿名函数
- php多进程
- 多进程开启
- 进程通信
- 进程信号
- 僵尸进程
- 孤儿进程
- 守护进程
- 同步/异步
- 阻塞/非阻塞
- 协程
- Swoole
- 初始Swoole
- 运行机制
- 生命周期
- composer使用
- EasySwoole
- 设计理念
- 组件说明
- 运行过程
- demo
- 提问的艺术