ThinkPHP5(fastadmin)使用Workerman  多线程通讯监听

文章介绍了如何在Linux系统(使用宝塔)、FastAdmin(TP5内核)和PHP7.4.3环境下,利用Workerman进行订单状态的实时推送。通过创建worker-server.php文件,设置控制器和端口监听,结合WebSocket实现前端与后端的通信,确保在有新订单时向前端推送信息并更新订单状态。同时,文章提到了安装和配置过程中可能遇到的问题以及解决方法。
摘要由CSDN通过智能技术生成

是关于订单的使用,订单新增根据状态推送,环境: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时是比较费劲的,不仅需要安装扩展,还需要把一些禁用函数删除,我是搞了一天多,报错报的我脑壳疼,不过这个报错就不搞了,只需要根据报错信息去进行调整就好了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值