websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程
websocket 后台新订单通知 —— Laravel 5.8 Laravel-echo-server教程
PHPSocket.IO,PHP跨平台实时通讯框架
PHPSocket.IO是PHP版本的Socket.IO服务端实现,基于workerman开发,用于替换node.js版本Socket.IO服务端。
PHPSocket.IO底层采用websocket协议通讯,如果客户端不支持websocket协议, 则会自动采用http长轮询的方式通讯。
环境
- Laravel 5.8
- PHPSocket.IO 1.1
安装依赖
composer require workerman/phpsocket.io
composer require guzzlehttp/guzzle
启动程序整合到artisan命令中
创建文件命令 php artisan make:command WorkermanCommand
app/Console/Commands/WorkermanCommand.php
workman PHPSocket.Io服务命令行启动程序

<?php namespace App\Console\Commands; use Workerman\Worker;
use PHPSocketIO\SocketIO; use Illuminate\Console\Command;
//
class WorkermanCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'workman
{action=start : start | restart | reload(平滑重启) | stop | status | connetions}
{--d : deamon or debug}'; /**
* The console command description.
*
* @var string
*/
protected $description = 'workman'; /**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
} /**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// 如果你在windows启动命令行,需要注释这一行服务才能启动
global $argv;
//启动php脚本所需的命令行参数
$argv[0] = 'workman';
$argv[1] = $this->argument('action'); // start | restart | reload(平滑重启) | stop | status | connetions
$argv[2] = $this->option('d') ? '-d' : ''; // 守护进程模式或调试模式启动 // https需要加上证书验证
if (env('APP_HEADER', 'http') == 'https') {
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/ssl/fullchain_all.pem',
'local_pk' => '/etc/nginx/ssl/privkey_all.pem',
'verify_peer' => false,
)
);
$io = new SocketIO(6001, $context);
} else {
$io = new SocketIO(6001);
}
$io->on('workerStart', function () use ($io) {
// 同时启动一个worker监听
$inner_http_worker = new Worker('http://0.0.0.0:6002');
$inner_http_worker->onMessage = function ($http_connection, $request) use ($io) {
// 接受推送过来的数据
$get = $request->get();
if (isset($get['type']) && !empty($get['type'])) {
// 向客户端发送响应事件请求,第二参数可以携带参数
$io->emit($get['type']);
}
if ($io) {
return $http_connection->send('ok');
} return $httpConnection->send('fail');
};
$inner_http_worker->listen();
}); Worker::runAll();
}
} workman PHPSocket.Io服务命令行启动程序
启动PHPSocket.Io服务
#以守护进程模式启动
php artisan workman start -d
#以调式模式启动
php artisan workman start
#终止
php artisan workman stop
#平滑重启
php artisan workman reload
web页面
<script src='//cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
// 连接服务端,如果是https请求则必须使用域名请求,证书是要验证域名的
var socket = io('http://127.0.0.1:6001');
// 触发服务端的chat message事件
socket.emit('chat message', '这个是消息内容...');
// 服务端通过emit('chat message from server', $msg)触发客户端的chat message from server事件
socket.on('chat message from server', function(msg){
console.log('get message:' + msg + ' from server');
});
</script>
打开web页面看看socket是否连接成功

推送消息
在laravel api层新建了一个NoticeController.php 用来发送响应事件

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; /*
* 消息提醒通知
* @author niuben
*/ class NoticeController extends Controller
{
const URL = "http://127.0.0.1:6002"; /*
* 发送消息通知
* @request post
* @param type
*
*/
public function setNotices(Request $request)
{
$post = $request->post();
if (!isset($post['type']) || empty($post['type'])) {
return ['code' => 200404, 'msg' => '参数缺失'];
} $message_request = $this->curl_get(self::URL . '?type='.$post['type']); if($message_request !='ok'){
return ['code' => 5324, 'msg' => '提醒发送失败'];
} return ['code' => 200, 'msg' => '成功'];
} /*
* curl get请求
*/
public function curl_get($url)
{ $header = array(
'Accept: application/json',
);
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
// 超时设置,以秒为单位
curl_setopt($curl, CURLOPT_TIMEOUT, 1); // 超时设置,以毫秒为单位
// curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500); // 设置请求头
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
//执行命令
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
}
这时候请求api,传入 type=chat message from server ,看看客户端是否打印出数据
这里是https://github.com/walkor/phpsocket.io/tree/master/docs/zh PHPSocket.IO文档,最近GitHub有点慢,所以可以访问下面的文档
workman PHPSocket.IO文档
websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程的更多相关文章
- 5.Fanout交换机之新订单通知商户场景
标题 : 5.Fanout交换机之新订单通知商户场景 目录 : RabbitMQ 序号 : 5 const string newOrderQueueName = "neworder-queu ...
- PHP使用AJax轮询实现新订单实时提醒
业务逻辑:Ajax每隔10秒钟请求一次接口,该接口会去查询数据库是否有新的订单,如果有则返回新订单的数量,后台收到声音提示,更改后台提醒数量 提醒框可链接到订单列表,后台更改完订单状态后会提醒会消失 ...
- Zencart先生成订单后付款,类似淘宝后台修改订单价格
Zencart 使用 Paypal 付款,会出现漏单的情况,即 paypal 已经收到客户的付款,但是网站后台没有客户的订单.导致 paypal 漏单的原因大致会是当客户跳转到Paypal 网站付款完 ...
- websocket后台数据推送
Websocket定义: 说明: 作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas.本地存储.多媒体编程接口.WebSocket 等等.这其中有“Web 的 TCP ...
- ECshop后台新功能权限添加
ecshop后台新功能权限的添加 1.在后台“推荐管理”里添加“推荐人分成”.“会员分成”两个操作功能以及权限 index.php?act=menu incluedes/inc_priv.php:权限 ...
- iOS 10 的一个重要更新-新的通知推送 API
iOS 10 最重要的变化可能就是通知 API 的重构了.本文用一个简单闹钟的例子介绍了 User Notification 的 API 变化和新功能. 简介 很久以前,开发者就可以在 iOS 里预约 ...
- 在ECSHOP后台的订单列表中显示配送方式
熟悉ECSHOP后台的人都知道,只有点击某个具体的订单,进入订单详细页面才能看到该订单的配送方式,最模板修改的目的,是想让管理者在订单列表页面 就能看到该订单的配送方式. 下面是修改方法:首先来修改 ...
- 后台接口平台 基于Laravel 开发 快速开发数据接口
laravelPCMS V1.5.0 项目地址:https://github.com/q1082121/laravelcms 喜欢的朋友可以支持下 点点星标 百牛信息技术bainiu.ltd整理发布于 ...
- laravel搭建博客实战的教程实例
这篇文章主要给大家介绍了关于利用laravel搭建一个迷你博客的相关资料,文中将一步步的实现步骤通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着来一起学习学习吧. 本文主 ...
- GoEasy实现websocket 推送消息通知到客户端
最近在实现一个推送功能,用户扫描二维码签到,后台及时将签到成功信息推送到浏览器端.排除了前端ajax轮询的方式,决定采用websocket及时推送. 于是发现了第三方websocket推送库GoEas ...
随机推荐
- Qt/C++音视频开发55-加密保存到文件并解密播放
一.前言 为了保证视频文件的安全性,有时候需要对保存的视频文件加密,然后播放的时候解密出来再播放,只有加密解密的秘钥一致时才能正常播放,用ffmpeg做视频文件的加密保存和解密播放比较简单,基于ffm ...
- Qt编写地图综合应用27-点聚合
一.前言 在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症.为了解决这一问题,我们需要一种手段能在用户有限的可视区 ...
- Qt开源作品10-代码统计组件
一.前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行.注释行.代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计.写完这个工具第一件事情就 ...
- Quartz分布式定时任务
前言: 项目需要执行定时任务,该类定时任务只需要实现类似Spring原生的@Scheudle注解的定时方法即可,无需考虑分片.刷新及重启,且因项目是多实例,所以需要考虑实现分布式,考察了目前开源的几款 ...
- 2022 年数据科学研究综述:重点介绍 ML、DL、NLP 等
2022 年数据科学研究综述:重点介绍 ML.DL.NLP 等 当我们在 2022 年底临近时,我对许多著名研究小组完成的所有惊人工作感到振奋,他们将 AI.机器学习.深度学习和 NLP 的状态扩展到 ...
- tomcat源码分析(一)如何启动服务
从startup.sh入手 os400=false case "`uname`" in OS400*) os400=true;; esac PRG="$0" w ...
- 内存吞金兽(Elasticsearch)的那些事儿 -- 架构&三高保证
系列目录 内存吞金兽(Elasticsearch)的那些事儿 -- 认识一下 内存吞金兽(Elasticsearch)的那些事儿 -- 数据结构及巧妙算法 内存吞金兽(Elasticsearch)的那 ...
- AVL树的插入
关于AVL树的插入,其实是一个比较复杂的问题,主要是在于他对于"旋转"这一概念,对于这一概念其实我感觉很多博主讲的都不是很明白,包括CHATGPT,也试了,但是也没有比较清楚的解释 ...
- JavaWeb的一些理解
WEB概述 WEB是什么 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上的资源分类 Internet上供外界访问的Web资源分为: 静态 ...
- w3cschool-Python3 高级教程
https://www.w3cschool.cn/python3/python3-reg-expressions.html Python3 正则表达式 re.match 函数 re.match 尝试从 ...