<?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"));
}
}
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")]);
}
}
onWorkerStart内的new Worker()并没有新起什么进程,始终工作在当前进程内;
那new Worker()的结果什么啊 我看它也有一些事件,比如:onMessage。它和$worker的关系是怎样的哇,它为什么不会阻塞onWorkerStart的执行流程。之前我尝试在onWorkerStart使用监听一个redis队列的方式来接收数据,但是会阻塞onWorkerStart往下执行
1、new Worker只是创建了一个worker实例,当这个实例是一个socket实例的时候,onXXX的一些回调自然就用上了;
2、新建的worker实例和$worker实例是完全独立的两个不同实例,没有任何关系;
3、使用监听redis队列的方式所引起的进程阻塞是因为涉及了IO操作,这个业务代码自己就能判定;
想了解一下为什么新起的worker实例不会阻塞onWorkerStart执行,我的猜想是监听端口也会阻塞至accept(当然有可能是使用select、epoll实现多路复用),能够说说为什么这个worker的监听不会阻塞onWorkerStart向下执行的原理吗?谢谢!
我的想法只要有监听就有while(true) {} 这种循环,保证一直去看有没有有的连接产生,然后读写数据
1、因为listen socket是非阻塞的;另外网络IO也是采用的基于事件的异步非阻塞模型;
2、workerman“不是可能”而是“确实”使用了IO多路复用技术;
我早上看了一下源码,不知道理解对不对。worker的listen方法在监听时调用的static来注册事件至$globalEvent这个全局数组(属于类静态变量,在同一个进程共享值),所以不管多久添加的事件都可以在loop里面一起监测有没有触发的
理解的没错呢,网络事件库就是这么玩的。
@614:算是明白了,不管哪种协议的connection都是统一注册到这个数组,统一loop的。
不是吧 我用ps看是有新的进程的呢
可以非常确定你截图里的onWorkerStart回调内的代码是工作在父进程所派生的当前的子进程内,并没有产生或者说工作在再下一级的子进程,所以你ps确认的肯定不正确。
可以 php 安装 Yac 扩展,webman 版本:v1.2.7
在 start.php 启动文件添加,
在 controller 文件夹内
已经过 jemter 并发测试过,测试通过
还能这么玩?
$yac = new Yac();
直接写在start.php不行吧,多个进程共享$yac
实例了,守护进程运行感觉会有问题。追加评论无法贴图,在下个楼层重新回复了 , php 代码贴上
这个不应该在子进程中吗?
我是 k8s docker 容器环境,第一次测试确实是非 -d 进程守护模式测试; 刚才特意改造了下 docker-compose.yml 文件, 结果还是成功;
jemeter 请求结果: