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


Posted in PHP onOctober 20, 2019

需求

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

主动消息推送实现

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

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

详细实现

# 这里是一个laravel中Commands
# 运行php artisan swoole start 即可运行
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use swoole_websocket_server;

class Swoole extends Command
{
 public $ws;
 /**
  * The name and signature of the console command.
  *
  * @var string
  */
 protected $signature = 'swoole {action}';

 /**
  * The console command description.
  *
  * @var string
  */
 protected $description = 'Active Push Message';

 /**
  * Create a new command instance.
  *
  * @return void
  */
 public function __construct()
 {
  parent::__construct();
 }

 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function handle()
 {
  $arg = $this->argument('action');
  switch ($arg) {
   case 'start':
    $this->info('swoole server started');
    $this->start();
    break;
   case 'stop':
    $this->info('swoole server stoped');
    break;
   case 'restart':
    $this->info('swoole server restarted');
    break;
  }
 }

 /**
  * 启动Swoole
  */
 private function start()
 {
  $this->ws = new swoole_websocket_server("0.0.0.0", 9502);
  //监听WebSocket连接打开事件
  $this->ws->on('open', function ($ws, $request) {
  });
  //监听WebSocket消息事件
  $this->ws->on('message', function ($ws, $frame) {
   $this->info("client is SendMessage\n");
  });
  //监听WebSocket主动推送消息事件
  $this->ws->on('request', function ($request, $response) {
   $scene = $request->post['scene'];  // 获取值
   $this->info("client is PushMessage\n".$scene);
  });
  //监听WebSocket连接关闭事件
  $this->ws->on('close', function ($ws, $fd) {
   $this->info("client is close\n");
  });
  $this->ws->start();
 }
}

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

# 调用activepush方法以后,会在cmd中打印出 
# client is PushMessage 主动推送消息 字眼
 /**
  * CURL请求
  * @param $data
  */
 public function curl($data)
 {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502");
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_HEADER, 1);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  curl_exec($curl);
  curl_close($curl);
 }
 
 /**
  * 主动触发
  */
 public function activepush()
 {
  $param['scene'] = '主动推送消息';
  $this->curl($param);   // 主动推送消息

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
基于mysql的论坛(3)
Oct 09 PHP
用PHP和ACCESS写聊天室(四)
Oct 09 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
Mar 15 PHP
PHP 实例化类的一点摘记
Mar 23 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
Jun 05 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
获取URL文件名后缀
Oct 24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
PHP实现重载的常用方法实例详解
Oct 18 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
Jan 02 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 #PHP
Laravel基础-关于引入公共文件的两种方式
Oct 18 #PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 #PHP
Laravel 前端资源配置教程
Oct 18 #PHP
tp5 实现列表数据根据状态排序
Oct 18 #PHP
tp5递归 无限级分类详解
Oct 18 #PHP
确保Laravel网站不会被嵌入到其他站点中的方法
Oct 18 #PHP
You might like
德生1994机评
2021/03/02 无线电
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
PHP生成随机密码类分享
2014/06/25 PHP
Yii中表单用法实例详解
2016/01/05 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
ie 调试javascript的工具
2009/04/29 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
Python实现的文本编辑器功能示例
2017/06/30 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
python脚本开机自启的实现方法
2019/06/28 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
德国帽子专家:Hutshopping
2019/11/03 全球购物
春节联欢晚会主持词范文
2014/03/24 职场文书
2014年标准化工作总结
2014/12/17 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js