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