ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
~~~ <?php use Workerman\Worker; use Workerman\Connection\TcpConnection; use Workerman\Protocols\Http\Request; use Workerman\Timer; include __DIR__ . '/vendor/autoload.php'; $ws_worker = new Worker("websocket://0.0.0.0:2120"); // 启动4个进程对外提供服务 $ws_worker->count = 1; $ws_worker->onConnect = function ($connection) { }; // 进程启动后建立一个内部通讯端口 $ws_worker->onWorkerStart = function ($ws_worker) { Timer::add(10, function () use ($ws_worker) { // 遍历当前进程所有的客户端连接,发送当前服务器的时间 foreach ($ws_worker->uidconnections as $connection) { $connection->send("pong1"); } }); $inner_text_worker = new Worker("http://0.0.0.0:2121"); $inner_text_worker->onMessage = function (TcpConnection $http,Request $request) use ($ws_worker) { $_POST=$request->post()?$request->post():$request->get(); $id = intval($_POST['id']); $message = htmlspecialchars_decode($_POST['content']); $res = sendMessageById($id, $message); $http->send($res ? 'ok' : "fails"); }; $inner_text_worker->listen(); }; $ws_worker->uidconnections=array(); // 客户端发送消息时回调 $ws_worker->onMessage = function ($connection, $data) use ($ws_worker) { if ($data == "ping") { sendMessageById($connection->uid, "pong"); } $data = json_decode($data, "true"); // 判断当前客户端是否已经验证过 if (!isset($connection->uid)) { if ($data["type"] == "from") { $connection->uid = intval($data["uid"]); // $ws_worker->connections[$connection->uid] = $connection; $ws_worker->uidconnections[$connection->uid]= $connection; } sendMessageById($connection->uid, ["type" => "message", "data" => "welcome:" . $connection->uid]); return; } }; // 当客户端连接断开时 $ws_worker->onClose = function ($connection) use ($ws_worker) { if (isset($ws_worker->uidconnections[$connection->uid])) { unset($ws_worker->uidconnections[$connection->uid]); } }; /** * sendMessageById 向指定的客户端推送数据 * * @param mixed $id * @param mixed $message * @access public * @return bool */ function sendMessageById($id, $message) { global $ws_worker; if (is_array($message)) $message = json_encode($message); if (isset($ws_worker->uidconnections[intval($id)])) { $connection = $ws_worker->uidconnections[intval($id)]; $connection->send($message); return true; } return false; } /** * broadcast 向所有用户推送数据 * * @param mixed $message * @access public * @return void */ function broadcast($message) { global $ws_worker; foreach ($ws_worker->uidconnections as $connection) { $connection->send($message); } } if (!defined('GLOBAL_START')) { Worker::runAll(); } ~~~