我想問一下這個$worker是屬于第一個進程的變量 怎么傳遞給onWorkerStart新起的worker進程的呢
onWorkerStart內(nèi)的new Worker()并沒有新起什么進程,始終工作在當(dāng)前進程內(nèi);
那new Worker()的結(jié)果什么啊 我看它也有一些事件,比如:onMessage。它和$worker的關(guān)系是怎樣的哇,它為什么不會阻塞onWorkerStart的執(zhí)行流程。之前我嘗試在onWorkerStart使用監(jiān)聽一個redis隊列的方式來接收數(shù)據(jù),但是會阻塞onWorkerStart往下執(zhí)行
1、new Worker只是創(chuàng)建了一個worker實例,當(dāng)這個實例是一個socket實例的時候,onXXX的一些回調(diào)自然就用上了;
2、新建的worker實例和$worker實例是完全獨立的兩個不同實例,沒有任何關(guān)系;
3、使用監(jiān)聽redis隊列的方式所引起的進程阻塞是因為涉及了IO操作,這個業(yè)務(wù)代碼自己就能判定;
想了解一下為什么新起的worker實例不會阻塞onWorkerStart執(zhí)行,我的猜想是監(jiān)聽端口也會阻塞至accept(當(dāng)然有可能是使用select、epoll實現(xiàn)多路復(fù)用),能夠說說為什么這個worker的監(jiān)聽不會阻塞onWorkerStart向下執(zhí)行的原理嗎?謝謝!
我的想法只要有監(jiān)聽就有while(true) {} 這種循環(huán),保證一直去看有沒有有的連接產(chǎn)生,然后讀寫數(shù)據(jù)
1、因為listen socket是非阻塞的;另外網(wǎng)絡(luò)IO也是采用的基于事件的異步非阻塞模型;
2、workerman“不是可能”而是“確實”使用了IO多路復(fù)用技術(shù);
我早上看了一下源碼,不知道理解對不對。worker的listen方法在監(jiān)聽時調(diào)用的static來注冊事件至$globalEvent這個全局?jǐn)?shù)組(屬于類靜態(tài)變量,在同一個進程共享值),所以不管多久添加的事件都可以在loop里面一起監(jiān)測有沒有觸發(fā)的
不是吧 我用ps看是有新的進程的呢
可以非常確定你截圖里的onWorkerStart回調(diào)內(nèi)的代碼是工作在父進程所派生的當(dāng)前的子進程內(nèi),并沒有產(chǎn)生或者說工作在再下一級的子進程,所以你ps確認(rèn)的肯定不正確。
可以 php 安裝 Yac 擴展,webman 版本:v1.2.7
在 start.php 啟動文件添加,
ini_set('display_errors', 'on');
error_reporting(E_ALL);
// 啟用 yac 內(nèi)存共享組件
$yac = new Yac();
在 controller 文件夾內(nèi)
<?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"));
}
}
已經(jīng)過 jemter 并發(fā)測試過,測試通過
追加評論無法貼圖,在下個樓層重新回復(fù)了 , 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")]);
}
}
我是 k8s docker 容器環(huán)境,第一次測試確實是非 -d 進程守護模式測試; 剛才特意改造了下 docker-compose.yml 文件, 結(jié)果還是成功;
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"
jemeter 請求結(jié)果: