解释一下 Workerman 中使用 global 问题

查看 69|回复 8
作者:cs5117155   
count = 1;
$http_worker->onWorkerStart = function ($worker) {
// 将 db 实例存储在全局变量中(也可以存储在某类的静态成员中)
    global $a;
    $a=0;
};
// 接收到浏览器发送的数据时回复 hello world 给浏览器
$http_worker->onMessage = function(TcpConnection $connection, Request $request)
{
    global $a;
    $a++;
    // 向浏览器发送 hello world
    $connection->send("hello world---$a");
};
// 运行 worker
Worker::runAll();
为何浏览器每次运行不是递增,而是 1,3,5,7,9....这样的

能否从计算机原理基础解释一下吗,我看 workman 文档说进程间的共享数据,可以用全局变量,或者管道,或者 redis 这样的存储工具,我声明了一个 global,该进程也是只有 1 个,读取$a 的时候,只会从$a 地址读取值,但是值每次都不是递增,实在想不通

b821025551b   
$a++ 后面打 log 进文件,看具体怎么执行的。
sun2920989   
看看浏览器是不是自动多请求了一次图标文件.
sun2920989   
或者换命令行或 postman 之类的工具再试试.
cs5117155
OP
  
@sun2920989 如果开了一个进程,确实多请求图标导致。但是如果我开了 4 个进程
hello world---4 ➜ ✗ curl http://127.0.0.1:2345
hello world---1 ➜ ✗ curl http://127.0.0.1:2345
hello world---1 ➜ ✗ curl http://127.0.0.1:2345
hello world---1 ➜ ✗ curl http://127.0.0.1:2345
hello world---1 ➜ ✗ curl http://127.0.0.1:2345
hello world---2 ➜ ✗ curl http://127.0.0.1:2345
hello world---2 ➜ ✗ curl http://127.0.0.1:2345
hello world---2 ➜ ✗ curl http://127.0.0.1:2345
hello world---3 ➜ ✗ curl http://127.0.0.1:2345
hello world---3 ➜ ✗ curl http://127.0.0.1:2345
hello world---2 ➜ ✗ curl http://127.0.0.1:2345
hello world---4 ➜ ✗ curl http://127.0.0.1:2345
hello world---5 ➜ ✗ curl http://127.0.0.1:2345
为何它$a 请求不一样,是因为我请求的时候是无状态,每次请求会从 4 个进程中随机选取一个,然后再进行$a++,所以每次请求的$a ,不一定是上一次请求的进程?
sundev   
一看就是浏览器多请求的。
还有如果多进程,workerman 是没有会话级别负载均衡的,就是从空闲的进程分配一个来处理的。
sundev   
你如果的确需要真全局变量的,你可以使用 https://github.com/walkor/GlobalData 来实现,或者用个缓存组件来做。
javalaw2010   
@cs5117155 workerman 是多进程的,你用 global 声明,其实只在当前的进程内有效,Worker::runAll()之后,进程就 fork 了,此时你的 global 变量在每个进程里都是独立的。
cs5117155
OP
  
@javalaw2010 谢谢,这样说,我就明了很多了,有时看文档说,进程间数据不互通,都是独立,需要编程者自已实现互通,总感觉就停留在似懂非懂的状态
您需要登录后才可以回帖 登录 | 立即注册

返回顶部