phpSwoole基本都是用项目中用到的PHP,但是由于任务耗时长,前端提交后需要服务端异步响应。服务器异步的解决方案有很多,包括MQ、fsocket、Swoole等,Swoole纯C语言编写,提供PHP语言的异步多线程服务器、异步TCP/UDP网络客户端、异步MySQL、异步Redis、数据库连接pool、AsyncTask、消息队列、毫秒定时器、异步文件读写、异步DNS查找。Swoole内置了Http/WebSocketserver/client,Http2.0server。最重要的是,它完美支持PHP语言。所以使用Swoole搭建一个异步服务器来提供异步响应、推送、定时任务等一系列工作。Swoole的安装是用C语言写的,编译安装。安装依赖为:php-5.3.10orhighergcc-4.4orhighermakeautoconfpcre(centos系统可以执行命令:yuminstallpcre-devel)安装方法:phpize#如果命令不存在,请在前面加上php实际的./configuremakesudomakeinstall的路径编译完成后需要在php.ini中添加扩展名extension=swoole.so来使用服务器类Server{private$serv;publicfunction__construct(){$this->serv=newswoole_server("0.0.0.0",9501);$this->serv->set(array(//'worker_num'=>1,//一般设置为服务器CPU数量的1-4倍'daemonize'=>1,//执行'max_request'=>10000,'task_worker_num'=>1,//任务进程数"task_ipc_mode"=>3作为守护进程,//使用消息队列通信,并设置为竞争模式'open_length_check'=>true,'dispatch_mode'=>1,'package_length_type'=>'N',//这个很关键,定位包头'package_length_offset'=>0,//第N个字节是包长度的值'package_body_offset'=>4,//开始计算长度的字节数'package_max_length'=>2000000,//协议的最大长度"log_file"=>"/tmp/swoole_test.log"//日志));$this->serv->on('Receive',array($this,'onReceive'));$this->serv->on('Task',array($this,'onTask'));$this->serv->on('Finish',array($this,'onFinish'));$this->serv->start();}publicfunctiononReceive(swoole_server$serv,$fd,$from_id,$data){//放入任务列表,开始执行$task_id=$serv->task($data);}publicfunctiononTask($serv,$task_id,$from_id,$data){//做一些事情}客户端classClient{private$client,$ip,$port,$params;公共函数__construct($ip,$port,$params){$this->ip=$ip;$this->port=$port;$this->params=$params;$this->client=newswoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_ASYNC);$this->client->set(array('open_length_check'=>true,'package_length_type'=>'N','package_length_offset'=>0,//第N个字节为包长度的值'package_body_offset'=>4,//开始计算长度的字节数'package_max_length'=>2000000,//最大长度协议));//设置事件回调函数$this->client->on('Connect',array($this,'onConnect'));$this->client->on('Receive',array($this,'onReceive'));$this->client->on('Close',array($this,'onClose'));$this->client->on('Error',array($this,'onError'));//发起网络连接$this->client->connect($ip,$port,3);}publicfunctiononReceive($cli,$data){echo"Received:".$数据。"\n";}publicfunctiononConnect($cli){$data=pack('N',strlen($data)).$数据;$cli->发送($data);$cli->关闭();}publicfunctiononClose($cli){echo"连接关闭\n";}publicfunctiononError(){echo"连接失败\n";}}注意问题'open_llength_check'=>true,'package_length_type'=>'N','package_length_offset'=>0,//第N个字节为package的值length'package_body_offset'=>4,//前几个字节开始计算Length'package_max_length'=>2000000,//co-length定义帧定界,因为Swoole的客户端和服务端通信是TCP连接,所以必须给出帧定界符,帧定界有很多种,具体可以参考Swoole官方文档。这是向标头添加额外长度的方法。更多学习内容可以访问【与大厂比较】优质PHP架构师教程目录。只要你会看,你的薪水就会更上一层楼(持续更新中))以上内容希望对大家有所帮助。很多PHPer在进阶的时候总会遇到一些问题和瓶颈。业务代码写多了就没有方向感了。我不知道从哪里开始改进。我整理了一些这方面的资料包括但不限于:分布式架构、高扩展性、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker,微服务,Nginx如果需要更多知识点和进阶进阶干货,可以免费分享给大家。需要的可以点击链接领取高级PHP月薪30k>>>架构师成长路线【免费获取视频和面试资料】
