当前位置: 首页 > 后端技术 > PHP

Swoole笔记(三)

时间:2023-03-29 13:44:32 PHP

WebSocket使用Swoole可以轻松搭建异步非阻塞多进程WebSocket服务器。WebSocket服务器set(array('daemonize'=>false,'worker_num'=>2,));$server->on('开始',function(swoole_websocket_server$server){echo"ServerStart...\n";swoole_set_process_name("swoole_websocket_server");});$server->on('ManagerStart',function(swoole_websocket_server$server){echo"ManagerStart\n";});$server->on('WorkerStart',function(swoole_websocket_server$server,$worker_id){echo"WorkerStart\n";if($server->worker_id==0){swoole_timer_tick(10000,function($id)use($server){echo"testtimer\n";});}});$server->on('Open',function(swoole_websocket_server$server,$request){echo"server:handshakesuccesswithfd{$request->fd}\n";});$server->on('Message',function(swoole_websocket_server$server,$frame){echo"receivefrom{$frame->fd}:{$frame->data},操作码:{$frame->opcode},fin:{$frame->finish}\n";$server->push($frame->fd,"thisisserver");});$server->on('关闭',function($ser,$fd){echo"client{$fd}closed\n";});$server->start();如果设置为,直接在shell中运行phpswoole_ws_server.php启动后台运行,可以使用如下命令强行杀掉进程:kill-9$(psaux|grepswoole|grep-vgrep|awk'{print$2}')或者重启worker进程:kill-10$(psaux|grepswoole_websocket_server|grep-vgrep|awk'{print$2}')Output:[2017-06-0122:06:21$2479.0]NOTICEServerisreloadingnow.WorkerStartWorkerStart注意:onMessage回调函数是强制的,当服务端收到客户端的数据帧时会回调此函数。/***@param$server*@param$frame包含客户端发送的数据帧信息;使用$frame->fd获取fd;$frame->data获取数据内容*/functiononMessage(swoole_server$server,swoole_websocket_frame$frame)使用$server->push()向客户端发送消息。最大长度不能超过2M。发送成功返回true,发送失败返回false。函数swoole_websocket_server->push(int$fd,string$data,int$opcode=1,bool$finish=true);最简单的WebSocket客户端是用JS写的:socket=newWebSocket('ws://192.168.1.107:9501/');socket.onopen=function(evt){//发送初始化消息socket.send('IamtheclientandI\'mlistening!');};//监听消息socket.onmessage=function(event){console.log('Clientreceivedamessage',event);};//监听Socket的关闭socket.onclose=function(event){console.log('客户端通知socket已关闭',event);};socket.onerror=function(evt){console.log('Clientonerror',event);};Swoole没有直接提供swoole_websocket客户端,但是可以通过引入WebSocketClient.php文件来实现:connect()){echo"连接失败\n";returnfalse;}$send_data="我是客户。\n";if(!$client->send($send_data)){echo$send_data."发送失败\n";返回假;}回声“发送成功\n";returntrue;上述代码实现了一个同步的swoole_websocket客户端发送消息后自动关闭,可以配合php-fpm应用:使用客户端发送耗时任务到swoole_websocket_server。创建聊天室的实际项目中,我们可以在两个方向绑定用户uid和fd(暂且不考虑分布式部署多台服务器),例如使用Redis保存:在用户信息校验后onMessage:$this->redis->set($fd,$uid);$this->redis->set($uid,$fd);后续需要指定给某人发送消息,只需要根据对uid/fd.unbind在onClose事件操作.群发只需要遍历$server->connections.例子(本项目只实现群发):moell-peng/webim:PHP实现的简单聊天室+Swoolehttps://github.com/moell-peng...HttpServerswoole内置Httpserversu端口。与php-fpm相比,swoole版本的httpserver最大的优势就是高性能:代码一次加载到内存,后面不需要解释执行。缺点是调试不如nginx+php-fpm方便。使用swoole,几行代码就可以写出一个异步非阻塞的多进程Http服务器:on('Start',function(){echo'Start';});$serv->on('Request',function($request,$response){var_dump($request->get);var_dump($request->post);var_dump($request->cookie);var_dump($request->files);var_dump($request->header);var_dump($request->server);$response->cookie("User","Swoole");$response->header("X-Server","Swoole");$response->end("

HelloSwoole!

");});$服务->开始();在shellphpswoole_http_server.php中使用,运行服务器。在浏览器中打开http://192.168.1.107:9502/查看输出。欢迎关注公众号,及时获取最新文章!