connection) $clients = []; // ---------- 主 worker:WebSocket 服务(员工前端连接) ---------- $wsWorker = new Worker('websocket://0.0.0.0:2346'); $wsWorker->name = 'ticket-broadcast'; $wsWorker->onConnect = function ($connection) use (&$clients) { $connection->cid = spl_object_id($connection); $clients[$connection->cid] = $connection; echo '[' . date('Y-m-d H:i:s') . "] client connected, online: " . count($clients) . PHP_EOL; }; $wsWorker->onClose = function ($connection) use (&$clients) { if (isset($clients[$connection->cid])) { unset($clients[$connection->cid]); } echo '[' . date('Y-m-d H:i:s') . "] client closed, online: " . count($clients) . PHP_EOL; }; // ---------- 进程启动后追加 HTTP 触发端口(仅本机) ---------- $wsWorker->onWorkerStart = function ($worker) use (&$clients) { $httpWorker = new Worker('http://127.0.0.1:2347'); $httpWorker->name = 'ticket-push-trigger'; $httpWorker->onMessage = function ($connection, Request $request) use (&$clients) { if ($request->method() === 'POST' && $request->path() === '/push') { $data = json_decode($request->rawBody(), true) ?: []; $payload = json_encode([ 'type' => 'ticket_changed', 'action' => isset($data['action']) ? (string)$data['action'] : 'update', 'ticket_id' => isset($data['ticket_id']) ? (int)$data['ticket_id'] : null, ], JSON_UNESCAPED_UNICODE); $sent = 0; foreach ($clients as $client) { $client->send($payload); $sent++; } echo '[' . date('Y-m-d H:i:s') . "] push [{$payload}] to {$sent} clients" . PHP_EOL; $connection->send('ok'); } else { $connection->send('bad request'); } }; // 同一进程内动态监听第二端口(Windows 下多 worker 的限制的官方解法) $httpWorker->listen(); }; Worker::runAll();