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短域名转换为实际域名函数
Jan 17 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
解析csv数据导入mysql的方法
Jul 01 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
教你php如何实现验证码
Jan 20 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
php 生成签名及验证签名详解
Oct 26 PHP
PHP goto语句用法实例
Aug 06 PHP
laravel 解决后端无法获取到前端Post过来的值问题
Oct 22 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 函数学习简单小结
2010/07/08 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
JavaScript prototype属性使用说明
2010/05/13 Javascript
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
vuex 的简单使用
2018/03/22 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
Python中分数的相关使用教程
2015/03/30 Python
Python中处理时间的几种方法小结
2015/04/09 Python
python实现textrank关键词提取
2018/06/22 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
执行力心得体会
2013/12/31 职场文书
大学毕业感言100字
2014/02/03 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
代办委托书怎样写
2014/04/08 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
公司财务管理制度
2015/08/04 职场文书