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 ...
随机推荐
- 推荐一个双语对照的 PDF 翻译工具的开源项目:PDFMathTranslate
今天给大家推荐一个双语对照的 PDF 翻译工具的开源项目:PDFMathTranslate . 项目介绍: 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Oll ...
- Java 中toString方法在枚举中的应用:展示枚举字段信息
在Java编程中,枚举(enum)是一种特殊的数据类型,它允许程序员定义一组固定的常量.枚举类型在Java中非常有用,尤其是在需要表示一组固定选项(如星期.月份.方向等)时.尽管枚举类型在定义时看起来 ...
- 《深入理解Mybatis原理》MyBatis动态SQL原理
引入 我们在使用mybatis的时候,会在xml中编写sql语句.比如这段动态sql代码: <update id="update" parameterType="o ...
- 安装Rational rose软件简单教程
安装Rational rose软件简单教程 一.下载文件 百度云盘下载链接:https://pan.baidu.com/s/1QWmTgxKlQtE5flP7dXIF5w 提取码:wjnq 二.装虚拟 ...
- Java API 之集合
1. 包装类 (基本类型中没有多少我们能够使用的方法和属性,为了便捷我们需要自己去写) 针对每一种基本类型提供了对应的类的形式 --- 包装类 byte short int long float ...
- w3cschool-Apache Pig 教程
https://www.w3cschool.cn/apache_pig/ 什么是Apache Pig? Apache Pig是MapReduce的一个抽象.它是一个工具/平台,用于分析较大的数据集,并 ...
- delphi编写sql脚本文件批量执行程序
程序使用DelphiXE11.1开发,用到控件UniDac9.1.1,QDAC里面的Qlog组件. 程序实现了SQL脚本文件批处理执行应用,运行效果图. 文件.pas代码 unit main; int ...
- uni-app封装网络请求promise
在项目的根目录下,创建http文件夹. 然后在创建request.js文件 文件代码如下 export function apiapi(myurl,myget,mydata,tou="Acc ...
- GDAL矢量数据集相关接口的资源控制问题
1. 引言 笔者在<使用GDAL读写矢量文件>这篇文章中总结了通过GDAL读写矢量的具体实现.不过这篇文章中并没有谈到涉及到矢量数据集相关接口的资源控制问题.具体来说,GDAL/OGR诞生 ...
- 生成对抗网络GAN简介
本文分享自天翼云开发者社区<生成对抗网络GAN简介>,作者:王****青 生成对抗网络(Generative Adversarial Networks,GAN)是一种深度敏感词模型,用于生 ...