进程之间共享数据

liuzeming

我想问一下这个$worker是属于第一个进程的变量 怎么传递给onWorkerStart新起的worker进程的呢

3773 4 1
4个回答

blogdaren

onWorkerStart内的new Worker()并没有新起什么进程,始终工作在当前进程内;

  • liuzeming 2020-07-17

    那new Worker()的结果什么啊 我看它也有一些事件,比如:onMessage。它和$worker的关系是怎样的哇,它为什么不会阻塞onWorkerStart的执行流程。之前我尝试在onWorkerStart使用监听一个redis队列的方式来接收数据,但是会阻塞onWorkerStart往下执行

  • blogdaren 2020-07-17

    1、new Worker只是创建了一个worker实例,当这个实例是一个socket实例的时候,onXXX的一些回调自然就用上了;
    2、新建的worker实例和$worker实例是完全独立的两个不同实例,没有任何关系;
    3、使用监听redis队列的方式所引起的进程阻塞是因为涉及了IO操作,这个业务代码自己就能判定;

  • liuzeming 2020-07-18

    想了解一下为什么新起的worker实例不会阻塞onWorkerStart执行,我的猜想是监听端口也会阻塞至accept(当然有可能是使用select、epoll实现多路复用),能够说说为什么这个worker的监听不会阻塞onWorkerStart向下执行的原理吗?谢谢!

  • liuzeming 2020-07-18

    我的想法只要有监听就有while(true) {} 这种循环,保证一直去看有没有有的连接产生,然后读写数据

  • blogdaren 2020-07-18

    1、因为listen socket是非阻塞的;另外网络IO也是采用的基于事件的异步非阻塞模型;
    2、workerman“不是可能”而是“确实”使用了IO多路复用技术;

  • liuzeming 2020-07-18

    我早上看了一下源码,不知道理解对不对。worker的listen方法在监听时调用的static来注册事件至$globalEvent这个全局数组(属于类静态变量,在同一个进程共享值),所以不管多久添加的事件都可以在loop里面一起监测有没有触发的

  • blogdaren 2020-07-18

    理解的没错呢,网络事件库就是这么玩的。

  • liuzeming 2020-07-18

    @614:算是明白了,不管哪种协议的connection都是统一注册到这个数组,统一loop的。

liuzeming

不是吧 我用ps看是有新的进程的呢

  • blogdaren 2020-07-15

    可以非常确定你截图里的onWorkerStart回调内的代码是工作在父进程所派生的当前的子进程内,并没有产生或者说工作在再下一级的子进程,所以你ps确认的肯定不正确。

elibool

可以 php 安装 Yac 扩展,webman 版本:v1.2.7

在 start.php 启动文件添加,

ini_set('display_errors', 'on');
error_reporting(E_ALL);

// 启用 yac 内存共享组件
$yac = new Yac();

在 controller 文件夹内

<?php

namespace app\controller;

use support\Request;
use support\Log;

class Index
{
    public function index(Request $request)
    {
        global $yac;
        $yac->add("ab", "hello");
        print_r($yac->get("ab"));
    }
}

已经过 jemter 并发测试过,测试通过

  • yongdao35 2022-03-31

    还能这么玩?$yac = new Yac();直接写在start.php不行吧,多个进程共享$yac实例了,守护进程运行感觉会有问题。

  • elibool 2022-04-01

    追加评论无法贴图,在下个楼层重新回复了 , php 代码贴上

    namespace app\controller;
    
    use support\Request;
    use support\Log;
    
    class Index
    {
        public function index(Request $request)
        {
            global $yac;
            $yac->add("abs", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
        }
    
        public function json(Request $request)
        {
            global $yac;
            return json([$yac->get("abs")]);
        }
    
    }
    
  • Tinywan 2022-04-01

    这个不应该在子进程中吗?

elibool

我是 k8s docker 容器环境,第一次测试确实是非 -d 进程守护模式测试; 刚才特意改造了下 docker-compose.yml 文件, 结果还是成功;

version: '3'
services:
  php-cli-7.4:
    build: php
    volumes:
      - ../ztjy-growth-zone-server:/wwwroot
      - ../data/runtime/:/wwwroot/runtime
      - ../data/app_config:/data/app_config
    ports:
      - 38000:38000
    command: >
      nohup sh -c "cd /wwwroot && php start.php start -d && top"
      # 原本命令为: sh -c "cd /wwwroot && php start.php start"

webman 均衡负载请求状况

jemeter 请求结果:
jemeter 20 个线程负载请求 100 次

  • 暂无评论
年代过于久远,无法发表回答
🔝