当前位置:首页 > PHP教程 > php高级应用 > 列表

Swoole实现异步投递task任务案例详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-14 20:33:30 浏览: 评论:0 

这篇文章主要介绍了Swoole实现异步投递task任务案例,结合实例形式详细分析了Swoole异步投递task任务的原理、实现方法及操作注意事项,需要的朋友可以参考下。

本文实例讲述了Swoole实现异步投递task任务案例。分享给大家供大家参考,具体如下:

【使用场景】

Swolle的task模块可以用来做一些异步的慢速任务、耗时场景。如webim中发广播,发送邮件等,把这些任务丢给task进程之后,worker进程可以继续处理新的数据请求,任务完成后会异步通知worker进程告诉它此任务已经完成。此外利用task还可以实现PHP的数据库连接池,异步队列等。

【使用须知】

必须设置Task进程数: task_worker_num

投递一个异步任务到task_worker池中:Server->task

必须注册onTask、onFinish2个事件回调函数。

【示例】

以创建一个WebSocket服务异步投递任务为例:

ws_server.php:

  1. <?php 
  2.  
  3. class Ws { 
  4.   public $ws = null; 
  5.   public function __construct() { 
  6.     $this->ws = new swoole_websocket_server("0.0.0.0", 9501); 
  7.     $this->ws->set([ 
  8.         'worker_num' => 2, //worker进程数 
  9.         'task_worker_num' => 2, //task进程数 
  10.       ]); 
  11.     $this->ws->on("open", [$this'onOpen']); 
  12.     $this->ws->on("message", [$this'onMessage']); 
  13.     $this->ws->on("task", [$this'onTask']); 
  14.     $this->ws->on("finish", [$this'onFinish']); 
  15.     $this->ws->on("close", [$this'onClose']); 
  16.     $this->ws->start(); 
  17.   } 
  18.  
  19.   //建立连接回调 
  20.   public function onOpen($ws$request) { 
  21.     echo "{$request->fd}建立了连接"
  22.   } 
  23.  
  24.   //接受消息回调 
  25.   public function onMessage($ws$frame) { 
  26.     //worker进程异步投递任务到task_worker进程中 
  27.     $data = [ 
  28.       'fd' => $frame->fd, 
  29.     ]; 
  30.     $ws->task($data); 
  31.  
  32.     //服务器返回 
  33.     echo "服务器发送消息:666"
  34.   } 
  35.  
  36.   //完成异步任务回调 
  37.   public function onTask($serv$task_id$worker_id$data) { 
  38.     var_dump($data); 
  39.  
  40.     //模拟慢速任务 
  41.     sleep(5); 
  42.  
  43.     //返回字符串给worker进程——>触发onFinish 
  44.     return "success"
  45.   } 
  46.  
  47.   //完成任务投递回调 
  48.   public function onFinish($serv$task_id$data) { 
  49.     //task_worker进程将任务处理结果发送给worker进程 
  50.     echo "完成任务{$task_id}投递 处理结果:{$data}"
  51.   } 
  52.  
  53.   //关闭连接回调 
  54.   public function onClose($ws$fd) { 
  55.     echo "{$fd}关闭了连接"
  56.   } 
  57.  
  58. $obj = new Ws(); 

前端页面js监听:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. <head> 
  4. <title>WebSocket</title> 
  5. </head> 
  6. <body> 
  7. </body> 
  8. <script type="text/javascript"
  9. var websocket = new WebSocket('ws://127.0.0.1:9501');  
  10.  
  11. websocket.onopen = function (evt) { onOpen(evt) };  
  12. websocket.onclose = function (evt) { onClose(evt) };  
  13. websocket.onmessage = function (evt) { onMessage(evt) };  
  14. websocket.onerror = function (evt) { onError(evt) };  
  15.    
  16. function onOpen(evt) { 
  17.   console.log("Connected to WebSocket server.");  
  18.     
  19.   //*发送消息到websocket服务器 
  20.   websocket.send('666'); 
  21. }  
  22. function onClose(evt) {  
  23.   console.log("Disconnected");  
  24. function onMessage(evt) {  
  25.   console.log('Retrieved data from server: ' + evt.data);  
  26. }  
  27. function onError(evt) {  
  28.   console.log('Error occured: ' + evt.data);  
  29. </script> 
  30. </html> 

开启WebSocket服务:

php ws_server.php

前后刷新了两次页面,WebSocket服务器监听结果:

Swoole php异步投递 task

Swoole php异步投递 task

(服务器会先返回消息给客户端,然后再执行投递任务)

Tags: Swoole php异步投递 task

分享到: