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编写物联网管理平台31-用户权限管理
一.前言 随着需求的不断变化,功能的增多,在用户信息这块,除了需要用户登录退出验证以外,还需要有个简单的用户权限逻辑处理,比如限定某些用户只有查看权限,没有删除记录.清空记录.系统设置的权限,与之相对 ...
- 利用SDCC开源项目搭建C51编译平台
下载sdcc 安装sdcc 安装sublime 新建编译系统输入以下内容 { "shell_cmd": "sdcc \"${file}\" " ...
- Solution Set -「AGC 010~012」C~F
目录 「AGC 010C」Cleaning 「AGC 010D」Decrementing 「AGC 010E」Rearranging 「AGC 010F」Tree Game ^ 「AGC 011C」S ...
- 让 LLM 来评判 | 选择 LLM 评估模型
基础概念 这是 让 LLM 来评判 系列文章的第一篇,敬请关注系列文章: 基础概念 选择 LLM 评估模型 设计你自己的评估 prompt 评估你的评估结果 奖励模型相关内容 技巧与提示 什么是评估模 ...
- Java API 之 Object
Object 顶级父类.任何一个类都将 Object 作为父类,也就意味着任何一个对象都可以赋值给 Object 对象.Object 类也是 Java 中唯一的一个没有父类的类. (方法默认是 pub ...
- runoob-Lua 教程
https://www.runoob.com/lua/lua-tutorial.html Lua 特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里. ...
- w3cschool-Scala 教程
https://www.w3cschool.cn/scala/ Scala 教程关于基础基础知识(续)Finagle 介绍集合Searchbird模式匹配与函数组合类型和多态基础高级类型简单构建工具更 ...
- SpringBoot启动报错:HikariPool-1 - Exception during pool initialization.
不说废话,直接上错误信息: 2020-06-23 10:48:19.899 INFO 10608 --- [ main] cn.wps.ep.account.sync.Application : St ...
- 求mod运算
求A mod B 要求 B必须是2的次方 方法 A mod B = A & (B - 1) 程序 #include <stdio.h> //10 mod 8 = 2 int add ...
- 银杏叶也是yxy
今年下半年(9月后)第一个使我震撼而狂喜的书籍,金阁寺. 翻译是林少华.他翻译这个可比村上春树好多了 一切都像梦寐一般,一切都如此完美 完美的结构,完美的心理叙述,撕心裂肺的景色描写 战后无限的虚无与 ...