為了復(fù)用EventSource的長連接,我把$request->connection存放在一個自己寫的類(PRefsGlobal)的成員變量下面(嘗試過把這個靜態(tài)類文件放在support目錄下面并配置自動加載,或者把這個文件直接放到model下),并且在與其他進程通信的時候從里面拿出來推送信息給用戶。
public function load(Request $request)
{
$dirname = $request->get('dirname');
if (!empty($dirname) && file_exists($dirname)) {
$task_connection = new AsyncTcpConnection('text://0.0.0.0:8888');
$task_connection->send(loadmsg($dirname));
$task_connection->onMessage = function (AsyncTcpConnection $task_connection, $task_result) {
PRefsGlobal::get("loadsse")->send(ssemessage($task_result));
if ($task_result == "Loading finished.") {
$task_connection->close();
PRefsGlobal::get("loadsse")->close();
}
};
$task_connection->connect();
return ok("success");
}
return error(404, "Wrong dirname!");
}
public function loadsse(Request $request)
{
return $this->establishsse($request, "loadsse");
}
private function establishsse(Request &$request, $name)
{
$connection = $request->connection;
if ($request->header('accept') === 'text/event-stream') {
// 首先發(fā)送一個 Content-Type: text/event-stream 頭的響應(yīng)
$connection->send(new Response(200, ['Content-Type' => 'text/event-stream', 'Access-Control-Allow-Origin' => '*']));
PRefsGlobal::set($name, $connection);
return new ServerSentEvents(['event' => 'message', 'data' => 'hello', 'id' => 1]);
}
return ok("ok");
}
prefsglobal類的代碼
期待由eventsource返回的處理進程的結(jié)果
實際結(jié)果
訪問/api/loadsse接口
"workerman/webman-framework": "^1.4.3"
1、進程間是隔離的,A進程PRefsGlobal存儲了connection,在B進程是取不到的
2、PRefsGlobal::set('loadsse ', $connection);
時打印下日志,PRefsGlobal::get("loadsse")->send(ssemessage($task_result));
前也打印下日志,看下有沒有執(zhí)行得到PRefsGlobal::set
,并且順序是正確的