当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel使用swoole实现websocket主动消息推送的方法介绍

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-14 10:06:57 浏览: 评论:0 

这篇文章主要给大家介绍了关于Laravel使用swoole实现websocket主动消息推送的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Laravel具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。

需求

需要实现一个可以主动触发消息推送的功能,这个可以实现向模板消息那个,给予所有成员发送自定义消息,而不需要通过客户端发送消息,服务端上message中监听传送的消息进行做相对于的业务逻辑。

主动消息推送实现

平常我们采用 swoole 来写 WebSocket 服务可能最多的用到的是open,message,close这三个监听状态,但是万万没有看下下面的onRequest回调的使用,没错,解决这次主动消息推送的就是需要用onRequest回调。

官方文档:正因为swoole_websocket_server继承自swoole_http_server,所以在 websocket 中有onRequest回调。

详细实现:

  1. # 这里是一个laravel中Commands 
  2. # 运行php artisan swoole start 即可运行 
  3. <?php 
  4.  
  5. namespace App\Console\Commands; 
  6.  
  7. use Illuminate\Console\Command; 
  8. use swoole_websocket_server; 
  9.  
  10. class Swoole extends Command 
  11.  public $ws
  12.  /** 
  13.   * The name and signature of the console command. 
  14.   * 
  15.   * @var string 
  16.   */ 
  17.  protected $signature = 'swoole {action}'
  18.  
  19.  /** 
  20.   * The console command description. 
  21.   * 
  22.   * @var string 
  23.   */ 
  24.  protected $description = 'Active Push Message'
  25.  
  26.  /** 
  27.   * Create a new command instance. 
  28.   * 
  29.   * @return void 
  30.   */ 
  31.  public function __construct() 
  32.  { 
  33.   parent::__construct(); 
  34.  } 
  35.  
  36.  /** 
  37.   * Execute the console command. 
  38.   * 
  39.   * @return mixed 
  40.   */ 
  41.  public function handle() 
  42.  { 
  43.   $arg = $this->argument('action'); 
  44.   switch ($arg) { 
  45.    case 'start'
  46.     $this->info('swoole server started'); 
  47.     $this->start(); 
  48.     break
  49.    case 'stop'
  50.     $this->info('swoole server stoped'); 
  51.     break
  52.    case 'restart'
  53.     $this->info('swoole server restarted'); 
  54.     break
  55.   } 
  56.  } 
  57.  
  58.  /** 
  59.   * 启动Swoole 
  60.   */ 
  61.  private function start() 
  62.  { 
  63.   $this->ws = new swoole_websocket_server("0.0.0.0", 9502); 
  64.   //监听WebSocket连接打开事件 
  65.   $this->ws->on('open'function ($ws$request) { 
  66.   }); 
  67.   //监听WebSocket消息事件 
  68.   $this->ws->on('message'function ($ws$frame) { 
  69.    $this->info("client is SendMessage\n"); 
  70.   }); 
  71.   //监听WebSocket主动推送消息事件 
  72.   $this->ws->on('request'function ($request$response) { 
  73.    $scene = $request->post['scene'];  // 获取值 
  74.    $this->info("client is PushMessage\n".$scene); 
  75.   }); 
  76.   //监听WebSocket连接关闭事件 
  77.   $this->ws->on('close'function ($ws$fd) { 
  78.    $this->info("client is close\n"); 
  79.   }); 
  80.   $this->ws->start(); 
  81.  } 

前面说的是 swoole 中onRequest的实现,下面实现下在控制器中主动触发onRequest回调,实现方法就是我们熟悉的curl请求。

  1. # 调用activepush方法以后,会在cmd中打印出  
  2. # client is PushMessage 主动推送消息 字眼 
  3.  /** 
  4.   * CURL请求 
  5.   * @param $data 
  6.   */ 
  7.  public function curl($data
  8.  { 
  9.   $curl = curl_init(); 
  10.   curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502"); 
  11.   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  12.   curl_setopt($curl, CURLOPT_HEADER, 1); 
  13.   curl_setopt($curl, CURLOPT_POST, 1); 
  14.   curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
  15.   curl_exec($curl); 
  16.   curl_close($curl); 
  17.  } 
  18.    
  19.  /** 
  20.   * 主动触发 
  21.   */ 
  22.  public function activepush() 
  23.  { 
  24.   $param['scene'] = '主动推送消息'
  25.   $this->curl($param);   // 主动推送消息

Tags: Laravel swoole websocket

分享到: