目录
- 初识Swoole
- 创建服务器(上)
- 创建服务器(下)
- 异步任务task
持续更新中。。。
什么是异步任务?
1.把当前的任务异步投递到TaskWorker进程池中执行,不影响接下来的事务。
举个栗子:
在一些需要耗时间长的任务可以采取这种方案
不管从性能的发挥还是用户体验都是比传统的方式舒服很多
测试
web_server.php
$server = new swoole_websocket_server("0.0.0.0", 8811);
$server->set(['task_worker_num' => 2,//设置异步任务的工作进程数量,可以根据任务的耗时和任务量配置适量的task进程。]
);$server->on('message', function ($server, $frame) {echo 'fd为: '.$frame->fd.'发送了:'.$frame->data."\n";//投递异步任务$task_id = $server->task($frame->fd);echo "我们继续访问\n";
});$server->on(&#39;task&#39;, function ($server, $task_id, $from_id,$data) {for ($i&#61;1; $i <&#61;5 ; $i&#43;&#43;) { sleep(2);//休息2秒echo &#39;taskid为:&#39;.$task_id.&#39;完成任务&#39;.$i."/5的任务了\n";}$server->finish($data);
});//处理异步任务的结果
$server->on(&#39;finish&#39;, function ($server, $task_id, $data) {echo &#39;fd为:&#39;.$data.&#39;,task为:&#39;.$task_id.&#39;任务完成的时间是:&#39;.date(&#39;Y-m-d H:i:s&#39;)."\n";
});$server->start();
客户端js代码
var url&#61;&#39;ws://你的ip地址:8811&#39;;var websocket &#61;new WebSocket(url);websocket.onopen &#61; function (evt) {console.log("Connected to WebSocket server.");websocket.send(&#39;客户端&#xff1a;建立链接成功&#39;);
};websocket.onclose &#61; function (evt) {console.log("Disconnected");
};websocket.onmessage &#61; function (evt) {console.log(&#39;Retrieved data from server: &#39; &#43; evt.data);
};websocket.onerror &#61; function (evt, e) {console.log(&#39;Error occured: &#39; &#43; evt.data);
};
我们先打开web_server&#xff0c;
然后通过浏览器打开2个客户端&#xff0c;这里为了区别进程&#xff0c;2个客户端打开的时间我是相差了几秒打开的
这个时候看终端&#xff0c;重点来了&#xff1a;
结论
所以我们得出了以下的结论:
1.task可以作为进程在后台运行不影响后面的执行&#xff0c;这里是异步的
2.task可以设置多个&#xff0c;一个task被占用&#xff0c;就使用另一个&#xff0c;
3.task完成任务之后&#xff0c;它就会被闲置&#xff0c;可以给下个客户端使用&#xff08;本案例没有展示出效果&#xff0c;有兴趣可以test一下&#xff09;
注意的地方
1.这个要注意task的数目&#xff0c;防止开销过多的性能
2.注意防止进程的堵塞&#xff0c;阻塞的进程十分耗资源而已长期占用无法被下个客户端使用
3.exit/die是危险的&#xff0c;会导致Worker进程退出
扩展
swoole里面的异步IO 读写文件 读写mysql 读写redis 也是异曲同工
异步IO 是先返回结果 再进行IO&#xff0c;不过这种大多应用于耗时间长但是结果不影响程序的情况&#xff0c;比如&#xff1a;
文章阅读量&#43;1
同步的流程是 redis/mysql 数据&#43;1->显示文章
而异步的流程是 直接显示文章 然后再发redis/mysql 数据&#43;1
这样子用户就减少了等待的时间&#xff0c;当然还有很多场景也适用
有兴趣的小伙伴可以继续研究文档io的部分&#xff0c;这里就不继续深究了
如果这篇文章对你有用&#xff0c;可以点个赞或者是收藏&#xff0c;算是对作者的鼓励~
文档地址传送门:https://wiki.swoole.com/wiki/...
推荐singwa老师的视频教程&#xff1a;https://coding.imooc.com/clas...
另附上小弟网站。。。www.entercode.cn 推广一波...