是关于订单的使用,订单新增根据状态推送,环境:linux系统(宝塔)、fastadmin(tp5内核)、php7.4.3,workerman1.0
首先需要先安装扩展,下载workerman
//安装扩展
yum install php-process
//下载
composer require topthink/think-worker
下载好之后tp6的会在application中会自动生成一个worker-server.php文件,没有生成的的话自己新建一个也是可以的,我这里因为是tp5的内核,所以自己创建了一个,一个文件对应一个控制器中的方法,控制器中的方法要可以一个控制器一个端口,实现多端口监听
<?php
define('APP_PATH', __DIR__ . '/../application/');
//定义监听控制器
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
然后自己创建一个模块目录,控制器目录,控制器,名字可以自己随便起,只要对应就好了

在控制器中的代码
<?php
namespace app\push\controller;
use think\worker\Server;
use Workerman\Lib\Timer;
use think\Db;
class Worker extends Server{
protected $socket = 'http://0.0.0.0:2346';
protected static $heartbeat_time=55;
public function __construct(){
parent::__construct();
}
/**
* 收到信息
* @param $connection
* @param $data
*/
public function onMessage($connection, $data)
{
if($data=="ping"&&$data==0){
}else{
//接收的参数
}
$connection->send("pong");
$connection->lastMessageTime=time();
}
/**
* 每个进程启动
* @param $worker
*/
public function onWorkerStart($worker){
//查看是否有新的充值或提现订单,有就推送给所有用户
Timer::add(3, function()use($worker){
$time_now=time();
$hasNewDepositOrder = Db::name('worker')->where('is_push',0)->order('id desc')->count('id');
// $system_listener = Db::name('worker')->cache(true)->order('id desc')->select();
if($hasNewDepositOrder){
$depositOrderInfo = Db::name('worker')->where('is_push',0)->order('id desc')->find();
$data = ['creatTime'=>date('Y-m-d H:i:s'),'name'=>$depositOrderInfo['name'],'tel'=>$depositOrderInfo['tel']];
foreach($worker->connections as $connection) {
if(empty($connection->lastMessageTime)){
$connection->lastMessageTime = $time_now;
}
if($time_now-$connection->lastMessageTime > self::$heartbeat_time){
$connection->close();
}
$connection->send(json_encode($data));
}
Db::name('worker')->where('id',$depositOrderInfo['id'])->update(['is_push'=>1]);
}else{
foreach($worker->connections as $connection) {
if(empty($connection->lastMessageTime)){
$connection->lastMessageTime = $time_now;
continue;
}
if($time_now-$connection->lastMessageTime > self::$heartbeat_time){ //连接超时
$connection->close();
}
}
}
});
}
}
大概意思就是当有新订单时将其的一部分信息返回到前端,然后将新订单的状态改为已推送
在使用时还需要先将其启动,在终端将目录指向application目录,执行命令,server.php是根据application目录下的server.php文件名,可以打开多个终端页面启动多个端口监听
php server.php start
前端请求
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
</body>
<script>
//实例化websocket,初始化url为101.42.165.236,端口为2346
let ws = new WebSocket("ws://101.42.165.236:4321");
console.log(ws);
let data;
ws.onopen = function () { //绑定连接事件
console.log("连接成功");
//每30秒发送一次心跳
setInterval(function () {
ws.send(JSON.stringify({
'type': "ping"
}));
console.log('发送心跳...');
}, 5000);
};
ws.onmessage = function (evt) { //绑定收到消息事件
data = JSON.parse(evt.data);
console.log(data);
//这里处理收到的消息, type类型有两种: connectin、deposit如果有deposit要提示有新的订单
};
ws.onclose = function (evt) { //绑定关闭或断开连接事件
console.log("连接已关闭");
};
</script>
</html>
大致就是这样了,其中在下载workerman时是比较费劲的,不仅需要安装扩展,还需要把一些禁用函数删除,我是搞了一天多,报错报的我脑壳疼,不过这个报错就不搞了,只需要根据报错信息去进行调整就好了