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 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
PHP中Session引起的脚本阻塞问题解决办法
Apr 08 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
PHP错误处理函数
Apr 03 PHP
php常用数组函数实例小结
Dec 29 PHP
php之可变变量的实例详解
Sep 12 PHP
PHP yield关键字功能与用法分析
Jan 03 PHP
如何解决PHP获取不到SESSION信息之一般情况
Oct 10 PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
js Array对象的扩展函数代码
2013/04/24 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Python Web开发模板引擎优缺点总结
2014/05/06 Python
Python计算回文数的方法
2015/03/11 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
售后服务承诺书怎么写
2014/05/21 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
镇创先争优活动总结
2014/08/28 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
学校推普周活动总结
2015/05/07 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
获奖感言一句话
2015/07/31 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript