Yii2 、socket 与 多进程
前两周做 code review的时候发现同事用了许久不见的 pcntl 扩展,每个进程用来消费一个 redis channal 提高对消息处理的吞吐量。
因为PHP 自身的一些原因,这套扩展在 PHP 中是不怎么常用的。记得比较有名的一个项目是 workerman。
多进程这块技术其实是一个挺对自身知识量存储的灵魂拷问,往深处挖,可以挖出来无数的东西:事务、锁、信号、IPC、IO操作、socket、多线程,这些都与进程有千丝万缕的关系。
几行代码
下面这段代码中 redis socket 链接会不会在多进程间共享,redis 指令取出的数据结果会不会错乱分配到非对应的进程?
1 |
|
man 2
Linux
Programmer's Manual
man 2 fork
1 |
|
父子进程间会 COPY 文件描述符,
man 2 soccket
1 |
|
socket 套接字是文件描述符。
又去翻阅了一下 unix网络编程 apue资料查阅了一下。unpv1 对多进程 socket 通信模型讲的很是浅显易懂,这里不再赘述。
基本可以确定socket 套接字如果在fork之前创建。TCP 链接链接就会被多个进程复用。对端无法区分是那个父子进程谁发过来的数据。
但是还是需要写代码验证一下,理论总是要是经过实践的检验才会踏实。
实验
1 |
|
1 |
|
1 |
|
关键就看这了
$redis = \Yii::$app->redis;
Yii2 中的组件依靠 yii\di\ServiceLocator
进行管理,它是一个控制反转依赖注入的实现。下面是部分代码片段:获取对象实例与注入对象定义。
1 |
|
结合 yii\redis\Connection
中的代码可以看出,
$redis = \Yii::$app->redis;
只生成了一个
yii\redis\Connection
对象,但是对socket创建却是惰性计算的,没有立即创建
socket。
结论
开头的问题也就有了答案,不会。
Yii2 、socket 与 多进程
http://blog.soul11201.com/2021/06/20/fork-socket/