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

swoole——从入门到放弃(一)

时间:2023-03-29 15:24:43 PHP

swoole——从入门到放弃(一)1、安装并下载swoole源码:gitclonehttps://gitee.com/swoole/swoole.gitviaphpize(扩展php扩展模块,构建php插件模块):cdswoole执行:your/phpize/path./configure--with-php-config=your/php/path/bin/php-configmake&&makeinstall可以看到swoole.so的位置我的位置是:/opt/soft/php/lib/php/extensions/no-debug-non-zts-20170718/配置php.ini加入extension=swoole。所以通过php-m命令,可以看到php扩展模块检测到swoole安装成功,php支持swoolecdyour/swoole/path/examples/serverphpecho.php(如果进程被阻塞,则表示成功)netstat-anp|grep9501(查看swoole开启的端口号)二、网络通信引擎学习swoole需要看文档,swoole文档1、通过swooletcpserver创建最简单的tcp服务(tcp_server.php)//创建一个Server对象并监听to127.0.0.1:9501port$serv=newswoole_server("127.0.0.1",9501);$serv->set(['worker_num'=>4,//worker进程数,cpu的1-4倍'max_request'=>100,]);/***监听连接传入事件*$fd客户端连接服务器的唯一标识*$reactor_id线程id*/$serv->on('connect',function($serv,$fd,$reactor_id){echo"Client:{$fd}-{$reactor_id}-Connect.\n";});//监听数据接收事件$serv->on('receive',function($serv,$fd,$reactor_id,$data){$serv->send($fd,"Server:".$data);});//监听连接关闭事件$serv->on('close',function($serv,$fd){echo"Client:Close.\n";});//启动服务器$serv->start();tcpclient(tcp_client.php)//创建tcp客户端$client=newswoole_client(SWOOLE_SOCK_TCP);//连接到tcp服务器if(!$client->connect("127.0.0.1",9501)){echo'connectionfailed';exit;}//phpclifwrite(STDOUT,'请输入:');$msg=trim(fgets(STDIN));//向tcp服务器发送消息if(!$client->send($msg)){echo'发送消息失败';exit;}//接收$result=$client->recv();echo$result;2.拓展:php的四个回调匿名函数$server->on('Request',function($req,$resp){echo"helloworld";});类静态方法类A{静态函数测试($req,$resp){echo"helloworld";}}$server->on('Request','A::Test');$server->on('Request',array('A','Test'));函数functionmy_onRequest($req,$resp){echo"helloworld";}$server->on('Request','my_onRequest');对象方法类A{函数测试($req,$resp){回声“你好世界”;}}$object=newA();$server->on('Request',array($object,'test'));提示:查看worker进程是否启动:psaft|greptcp_server.php3.udp的server和client可以根据文档创建4.http服务//监听所有地址和9501端口$http=newswoole_http_server('0.0.0.0',9501);//动静分离配置$http->set([//启用静态请求'enable_static_handler'=>true,//静态资源目录'document_root'=>'/opt/app/code1/',]);$http->on('request',function($request,$response){//获取获取请求参数$param=json_encode($request->get);//设置cookie$response->cookie('name','ronaldo',time()+1800);//输出到页面$response->end("

HelloSwoole-{$param}

");});//开启http服务$http->开始();5。通过swoolewebsocketserver(websocket_server.php)创建websocket服务//监听所有地址和9502端口$server=newswoole_websocket_server('0.0.0.0',9502);//动静分离配置$server->set([//启用静态请求'enable_static_handler'=>true,//静态资源目录'document_root'=>'/opt/app/swoole/websocket',]);$server->on('open',function($server,$request){echo"server:与fd握手成功-{$request->fd}\n";});$server->on('message',function($server,$frame){echo"从{$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";$server->push($frame->fd,"这是服务器");});$server->on('close',function($server,$fd){echo"client-{$fd}-close\n";});$服务器->开始();websocket客户端(websockt_client.html)//创建websocket实例varwebsocketURL="ws://www.rona1do.top:9502";varwebsocket=newWebSocket(websocketURL);//实例化对象的onopen属性websocket.onopen=function(ev){websocket.send("hello-websocket");console.log("connect-swoole-success");}//实例化对象的onmessage属性,接收服务器返回的数据websocket.onmessage=function(ev){console.log("websockect-server-return-data:"+ev.data);}//关闭websocket.onclose=function(ev){console.log("关闭");}6.使用面向对象优化websocket服务代码classWebSocket{constHOST='0.0.0.0';常量端口=9502;私人$ws=null;函数__construct(){$this->ws=newswoole_websocket_server(self::HOST,self::PORT);$this->ws->on('open',[$this,'onOpen']);$this->ws->on('消息',[$this,'onMessage']);$this->ws->on('close',[$this,'onClose']);$this->ws->start();}//监听websocket连接事件functiononOpen($server,$request){echo"server:handshakesuccesswithfd{$request->fd}\n";}//监听websocket消息接收EventfunctiononMessage($server,$frame){echo"receivefrom{$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";$server->push($frame->fd,"这是服务器");}//监听客户端关闭事件函数onClose($server,$fd){echo"Client:{$fd}closes\n";}}7、swooleonTask中的小任务案例:task_worker进程中调用的worker进程可以使用swoole_server_task函数向task_worker进程下发新任务,当前Task进程正在调用onTask函数回调时,进程状态会切换为busy,此时不会接收到新的Task,当onTask函数返回时,进程状态会切换为idle,然后继续接收新的任务。onFinish:当worker进程下发的任务在task_worker进程完成时,task进程会将任务处理结果通过swoole_server->finish()方法发送给worker进程。Websocket类{constHOST='0.0.0.0';常量端口=9502;私人$ws=null;publicfunction__construct(){$this->ws=newswoole_websocket_server(self::HOST,self::PORT);$this->ws->set(['worker_num'=>2,'task_worker_num'=>2,//要使用任务必须要指示]);$this->ws->on('open',[$this,'onOpen']);$this->ws->on('消息',[$this,'onMessage']);$this->ws->on('task',[$this,'onTask']);$this->ws->on('完成',[$this,'onFinish']);$this->ws->on('close',[$this,'onClose']);$this->ws->start();}publicfunctiononOpen($server,$request){echo"server:与fd握手成功:{$request->fd}\n";}publicfunctiononMessage($server,$frame){echo"从{$frame->fd}:{$frame->data}接收\n";//需要投递的任务数据$data=['fd'=>$frame->fd,'msg'=>'任务',];$服务器->任务($数据);$server->push($frame->fd,'这是服务器');}//处理传递任务的方法,非阻塞publicfunctiononTask($server,$task_id,$worker_id,$data){print_r($data);//模拟大量数据的操作sleep(10);返回“任务完成”;}//传递任务处理后调用的方法publicfunctiononFinish($server,$task_id,$data){echo"task_id:{$task_id}\n";echo"任务完成成功:{$data}\n";}publicfunctiononClose($server,$fd){echo"Client:close";}}