静态类多进程之间共享数据的问题

9raxdev

假设有一个静态类

class Data{
    static $rules;
}

我在new Worker 前对$rules进行了赋值操作,后面在 $worker->onMessage(){} 里面进行了修改。

那么在onMessage的操作其余的进程能否读取到操作后的?

多进程之间onMessage是如何区别当前属于哪个进程,为什么我在

$worker->onMessage=function($connection){
    echo $connection->id;
    //固定的
};

如何调试各个进程的$rules的状态?

2132 1 1
1个回答

blogdaren

1、读不到: 多进程之间的进程变量是彼此隔离的,是不能直接互相访问的,如果要共享的话,需要借助GlobalData、redis组件来实现;
2、区分各个进程: 每个进程都有一个唯一的id编号,其实本质和进程ID是以一对一的概念抽象,可以这样获取区分:

$worker_id = $connection->worker->id;

3、connection->id固定: 这个是每个tcp连接的id编号,当前活动进程内自增唯一,最大值为PHP_INT_MAX。

  • 9raxdev 2020-07-07

    在此基础之上,有没有方法控制链接请求走哪个$worker_id ?貌似本地测试的时候一直是$connection->worker->id =1 的在响应

  • blogdaren 2020-07-07

    1、这个没法控制的,哪个进程去accept哪个连接请求这是由操作系统内核调度的。
    2、不要被"某个连接一直似乎被某个进程在处理"的表面现象给迷惑了,你多压测连接量自然就看出不是这么回事了,一个进程能一直在处理,只能说明这个进程还是不够繁忙能够处理过来。

年代过于久远,无法发表回答
🔝