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 相关文章推荐
php checkdate、getdate等日期时间函数操作详解
Mar 11 PHP
利用PHP实现短域名互转
Jul 05 PHP
举例详解PHP脚本的测试方法
Aug 05 PHP
PHP中addslashes与mysql_escape_string的区别分析
Apr 25 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
轻松实现php文件上传功能
Feb 17 PHP
PHP中include和require的区别实例分析
May 07 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
利用PHP实现开心消消乐的算法示例
Oct 12 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 PHP
PHP token验证生成原理实例分析
Jun 05 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
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
vue路由懒加载的实现方法
2018/03/12 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
Python常用列表数据结构小结
2014/08/06 Python
Python XML RPC服务器端和客户端实例
2014/11/22 Python
python中dir函数用法分析
2015/04/17 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
详解python3中的真值测试
2018/08/13 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
行政经理的岗位职责
2013/11/23 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
企业安全生产承诺书
2014/05/22 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
服务员态度差检讨书
2014/10/28 职场文书
小学生作文批改评语
2014/12/25 职场文书
财务部岗位职责
2015/02/03 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python