swoole使用案例
发布时间:2022-08-02 13:56:33 所属栏目:PHP教程 来源:互联网
导读:swoole使用 服务器及客户端 4种服务器【tcp/udp/web/websocket】 TCP服务器 //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server(127.0.0.1, 9501); //监听连接进入事件 $serv-on(connect, function ($serv, $fd) { echo Client: Connect.
|
swoole使用 服务器及客户端 4种服务器【tcp/udp/web/websocket】 TCP服务器 //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0.1", 9501); //监听连接进入事件 $serv->on('connect', function ($serv, $fd) { echo "Client: Connect.n"; }); //监听数据接收事件 $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, "Server: ".$data); }); //监听连接关闭事件 $serv->on('close', function ($serv, $fd) { echo "Client: Close.n"; }); //启动服务器 $serv->start(); UDP服务器 //创建Server对象,监听 127.0.0.1:9502端口,类型为SWOOLE_SOCK_UDP $serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); //监听数据接收事件 $serv->on('Packet', function ($serv, $data, $clientInfo) { $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data); var_dump($clientInfo); }); //启动服务器 $serv->start(); http服务器 $http = new swoole_http_server("0.0.0.0", 9501); $http->on('request', function ($request, $response) { var_dump($request->get, $request->post); $response->header("Content-Type", "text/html; charset=utf-8"); $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>"); }); $http->start(); websocket服务器 服务器端: //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server(“0.0.0.0”, 9502); //监听WebSocket连接打开事件 $ws->on('open', function ($ws, $request) { var_dump($request->fd, $request->get, $request->server); $ws->push($request->fd, "hello, welcomen"); }); //监听WebSocket消息事件 $ws->on('message', function ($ws, $frame) { echo "Message: {$frame->data}n"; $ws->push($frame->fd, "server: {$frame->data}"); }); //监听WebSocket连接关闭事件 $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closedn"; }); $ws->start(); 客户端JS: var wsServer = 'ws://192.168.50.151:9502'; var websocket = new WebSocket(wsServer); websocket.onopen = function (evt) { console.log("Connected to WebSocket server."); }; websocket.onclose = function (evt) { console.log("Disconnected"); }; websocket.onmessage = function (evt) { console.log('Retrieved data from server: ' + evt.data); }; websocket.onerror = function (evt, e) { console.log('Error occured: ' + evt.data); }; 辅助 定时器 //每隔2000ms触发一次 swoole_timer_tick(2000, function ($timer_id) { echo "tick-2000msn"; }); //3000ms后执行此函数 swoole_timer_after(3000, function () { echo "after 3000ms.n"; }); 异步tcp服务器处理任务 $serv = new swoole_server("127.0.0.1", 9501); //设置异步任务的工作进程数量 $serv->set(array('task_worker_num' => 4)); $serv->on('receive', function($serv, $fd, $from_id, $data) { //投递异步任务 $task_id = $serv->task($data); echo "Dispath AsyncTask: id=$task_idn"; }); //处理异步任务 $serv->on('task', function ($serv, $task_id, $from_id, $data) { echo "New AsyncTask[id=$task_id]".PHP_EOL; //返回任务执行的结果 $serv->finish("$data -> OK"); }); //处理异步任务的结果 $serv->on('finish', function ($serv, $task_id, $data) { echo "AsyncTask[$task_id] Finish: $data".PHP_EOL; }); $serv->start(); tcp同步客户端 $client = new swoole_client(SWOOLE_SOCK_TCP); //连接到服务器 if (!$client->connect('127.0.0.1', 9501, 0.5)) { die("connect failed."); } //向服务器发送数据 if (!$client->send("hello world")) { die("send failed."); } //从服务器接收数据 $data = $client->recv(); if (!$data) { die("recv failed."); } echo $data; //关闭连接 $client->close(); tcp异步客户端 $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); //注册连接成功回调 $client->on("connect", function($cli) { $cli->send("hello worldn"); }); //注册数据接收回调 $client->on("receive", function($cli, $data){ echo "Received: ".$data."n"; }); //注册连接失败回调 $client->on("error", function($cli){ echo "Connect failedn"; }); //注册连接关闭回调 $client->on("close", function($cli){ echo "Connection closen"; }); //发起连接 $client->connect('127.0.0.1', 9501, 0.5); 自定义通讯协议设计 进程/协程管理 进程 单独进程 $process = new swoole_process('callback_function', true); $pid = $process->start(); function callback_function(swoole_process $worker){ $worker->exec('/usr/bin/php', array(__DIR__.'/write_file.php')); }// 启用本地的命令,加上绝对路径 swoole_process::wait(); 【子进程】管道缓冲区读写及事件监听? $workers = []; $worker_num = 3;//创建的进程数 for($i=0;$i<$worker_num; $i++){ $process = new swoole_process('process');// 创建子进程 启动函数为 process $pid = $process->start();// 子进程启动 $workers[$pid] = $process;// 存入字符数组 } foreach($workers as $process){ //子进程会包含此事件,加入到子进程中 异步IO swoole_event_add($process->pipe, function ($pipe) use($process){ $data = $process->read(); echo "RECV: " . $data.PHP_EOL;// 接收数据 });//函数调用的神奇情况 (编辑:承德站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
