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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
文件上传类
Oct 09 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
用PHP读取和编写XML DOM的实现代码
Feb 03 PHP
php class类的用法详细总结
Oct 17 PHP
php时间戳转换的示例
Mar 31 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
laravel通过a标签从视图向控制器实现传值
Oct 15 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 PHP
php远程请求CURL案例(爬虫、保存登录状态)
Apr 01 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的几个常用数字判断函数代码
2012/04/24 PHP
PHP中的替代语法简介
2014/08/22 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
javascript eval函数深入认识
2009/02/21 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
宣传部部长竞选演讲稿
2014/04/26 职场文书
药店促销活动总结
2014/07/10 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python