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 相关文章推荐
做一个有下拉功能的留言版
Oct 09 PHP
用PHP的ob_start() 控制您的浏览器cache
Aug 03 PHP
linux iconv方法的使用
Oct 01 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
php函数与传递参数实例分析
Nov 15 PHP
php数组查找函数总结
Nov 18 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
Aug 30 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
php&amp;java(一)
2006/10/09 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
python实现学生管理系统
2018/01/11 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python 实现视频 图像帧提取
2019/12/10 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
在求职信中如何凸显个人优势
2013/10/30 职场文书
写给保洁员表扬信
2014/01/08 职场文书
仓库主管岗位职责
2014/03/02 职场文书
作风建设整改方案
2014/10/27 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
海上钢琴师观后感
2015/06/03 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android