Workerman是什么?Workerman是一个纯PHP开发的开源高性能PHP套接字服务框架。工人不是在重新发明轮子。它不是一个MVC框架,而是一个更底层、更通用的socket服务框架。你可以用它来开发tcp代理,天梯代理,游戏服务器,邮件服务器,ftp服务器,甚至可以开发一个php版本的php版本的redis,php版本的数据库,php版本的nginx,phpphp版本的-fpm等Workerman可以说是PHP领域的一次革新,让开发者彻底摆脱PHP只能做WEB的束缚。其实Workerman类似于一个PHP版的nginx,核心也是多进程+Epoll+非阻塞IO。Workerman的每个进程都可以保持上万个并发连接。由于是常驻内存,不依赖Apache、nginx、php-fpm等容器,具有超高性能。同时支持TCP、UDP、UNIXSOCKET,支持长连接,支持Websocket、HTTP、WSS、HTTPS等通信协议和各种自定义协议。拥有定时器、异步socket客户端、异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。Workerman的一些应用方向Workerman不同于传统的MVC框架。Workerman不仅可以用于Web开发,还有更广泛的应用领域,如即时通讯、物联网、游戏、服务管理、其他服务器或中间件等。这无疑大大提高了PHP开发人员的眼界。目前,这些领域的PHP开发人员很紧缺。如果你想在PHP领域有自己的技术优势,不满足于日常的增删改查,或者想往架构师或技术大师方向发展,Workerman非常值得。学习框架。建议开发者不仅要懂得使用,还要基于Workerman开发自己的开源项目,提高技能,增加影响力。比如Beanbun多进程网络爬虫框架就是一个很好的例子,上线不久就收获了很多好评。Workerman的部分应用方向如下:1.即时通讯,如网页即时聊天、即时消息推送、微信小程序、手机APP消息推送、PC端软件消息推送等【例workerman-chat聊天室、网页消息推送、蝌蚪聊天室]2.物联网,如Workerman与打印机的通讯、与单片机的通讯、智能手环、智能家居、共享单车等[易连云、易博时代等客户案例]3.棋牌类游戏、MMORPG类游戏等游戏服务器[示例browserquest-php]4.HTTP服务,如编写高性能HTTP接口、高性能网站等。如果要做HTTP相关的服务或站点,webman5和面向服务的SOA使用Workerman将现有业务的不同功能单元进行封装,以服务的形式提供统一的接口,实现系统松耦合,易维护,高可用,并且易于拉伸。[示例workerman-json-rpc、workerman-thrift]6.其他服务器软件如GatewayWorker、PHPSocket.IO、http代理、sock5代理、分布式通信组件、分布式变量共享组件、消息队列、DNS服务器、WebServer、CDNServer,FTP服务器等7.中间件如异步MySQL组件、异步redis组件、异步http组件、异步消息队列组件、异步dns组件、文件监控组件,以及很多第三方开发的组件框架等,显然是传统的它mvc框架很难实现以上功能,所以才诞生了workerman。接下来使用workerman建立websocket连接,实现一个简单的聊天例子。下载workerman源码包并将源码导入到start.php中,将源码包vendor目录与start.php放在同级目录下。start.php的代码如下:count=1;//连接事件,阻塞非法连接$ws_worker->onConnect=function($connection)use($domains){};//进程启动后创建内部通信端口$ws_worker->onWorkerStart=function($ws_worker){$inner_text_worker=newWorker("Text://0.0.0.0:10087");$inner_text_worker->onMessage=function($connection,$buffer)使用($ws_worker){$data=json_decode($buffer,true);$id=$data['id'];//通过workerman向id的页面推送数据$ret=sendMessageById($id,$buffer);//返回推送结果$connection->send($ret?'ok':'fail');};$inner_text_worker->listen();$inner_text_worker=newWorker("http://0.0.0.0:10087");$inner_text_worker->onMessage=function($http)use($ws_worker){$id=$_POST['id'];$status=$_POST['status'];//通过workerman向id的页面推送数据$ret=sendMessageById($id,['id','status'=>$status]);//返回推送结果$http->send($ret?'ok':'fail');};$inner_text_worker->listen();};//添加一个属性来保存从uid到连接的映射$ws_worker->uidConnetions=[];//客户端发送消息时回调$ws_worker->onMessage=function($connection,$data)use($ws_worker){//判断当前客户端是否已经认证if(!isset($connection->uid)){$connection->uid=$data;$ws_worker->uidConnetions[$connection->uid]=$connection;return;}};//客户端连接断开时$ws_worker->onClose=function($connection)use($ws_worker){if(isset($connection->uid)){unset($ws_worker->uidConnetions[$connection->uid]);}};/**sendMessageById给指定Client推送数据@parammixed$id@parammixed$message@accesspublic@returnbool*/functionsendMessageById($id,$message){if(is_array($message))$message=json_encode($message);global$ws_worker;如果(isset($ws_worker->uidConnetions[$id])){$connection=$ws_worker->uidConnetions[$id];$connection->send($message);returntrue;}returnfalse;}/**向所有用户广播推送数据@parammixed$message@accesspublic@returnvoid*/functionbroadcast($message){global$ws_worker;foreach($ws_worker->uidConnetions作为$连接){$connection->send($message);}}工人::runAll();2、启动服务进程:phpstart.phpstart向相应端口发送http请求,代码如下:functionpost($url,$data=[],$timeout=3){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);//设置超时curl_setopt($ch,CURLOPT_POSTFIELDS,$data);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);$result=curl_exec($ch);curl_close($ch);return$result;}}//向http服务发送http请求$data['id']=100;$data['status']=6;//你的IP地址+端口号$url='http://192.168.16.101:10087';$result=post($url,$data);回声$结果。"\n";4.客户端连接代码:
