workerman发送请求后,客户端持续收到请求

mljun

问题描述

物联网卡+盒子,服务器发起盒子投币请求,但机台币数一直增加

程序代码或配置

截图
截图
config.php:

return [
    // 注册服务配置
    'register' => [
        // 注册服务地址,用于gateway及business服务注册 (必须)
        'address'   => '127.0.0.1:1256',
        // 网关服务线程名称,status方便查看
        'name'      => 'RegisterWorker',
        // register服务秘钥
        'secretKey' => '',
    ],
    // gateway服务配置
    'gateway'  => [
        // gateway监听地址,用于客户端连接 (必须)
        'socket'               => 'tcp://0.0.0.0:1220',
        // 网关服务线程名称,status方便查看
        'name'                 => 'GatewayWorker',
        // gateway进程数
        'count'                => 4,
        // 本机ip,分布式部署时使用内网ip,用于与business内部通讯
        'lanIp'                => '127.0.0.1',
        // 内部通讯起始端口,每个 gateway 实例应该都不同,假如$gateway->count=4,起始端口为4000        则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
        'startPort'            => 2900,
        // 是否可以平滑重启,gateway 不能平滑重启,否则会导致连接断开
//        'reloadable'           => false,
        // 心跳时间间隔,设为0则表示不检测心跳
        'pingInterval'         => 25,
        // $gatewayPingNotResponseLimit * $gatewayPingInterval 时间内,客户端未发送任何数据,断开客户端连接 (设为0表示不监听客户端返回数据)
        'pingNotResponseLimit' => 2,
        // 服务端向客户端发送的心跳数据,为空不给客户端发送心跳数据
        'pingData'             => hex2bin('0a241a0081150716152a2A0000000000000000000000008a0d0a'),
        // gateway服务秘钥
        'secretKey'            => '',
    ],
    // business服务配置
    'business' => [
        // business服务名称,status方便查看
        'name'                  => 'BusinessWorker',
        // business进程数
        'count'                 => 4,
        // 业务服务事件处理
        'eventHandler'          => 'app\worker\starter\Events',
        // 业务超时时间,可用来定位程序卡在哪里
        'processTimeout'        => 30,
        // 业务超时后的回调,可用来记录日志
        'processTimeoutHandler' => '\\Workerman\\Worker::log',
        // 业务服务秘钥
        'secretKey'             => '',
        // 是否允许多进程监听同一端口, php7才支持
        'reusePort'             => true,
    ],
];

start_gateway.php

// 检查扩展是否加载
Utils::checkExtension();

$config = require __DIR__ . '/config.php';
$registerConfig = $config['register'];
$gatewayConfig = $config['gateway'];

// gateway 进程,使用配置的值
$gateway = new Gateway($gatewayConfig['socket']);
// 给注册服务属性赋值 (只赋值支持的属性)
foreach (['name', 'count', 'lanIp', 'startPort', 'pingInterval', 'pingNotResponseLimit', 'pingData', 'secretKey'] as $key) {
    isset($gatewayConfig[$key]) && $gateway->$key = $gatewayConfig[$key];
}
// 服务注册地址
$gateway->registerAddress = $registerConfig['address'];

// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $data)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
//        if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
//        {
//            $connection->close();
//        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        $connection->send(hex2bin('00'));
    };
};

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START')) {
    Worker::runAll();
}

截图

截图

发币脚本:
截图

重现问题的步骤

盒子连接成功、偶尔断开连接
发币脚本执行后机台币量一直增加不停

操作系统环境及workerman/webman等具体版本

linunx gateway

498 1 0
1个回答

静默

业务bug需要自己排查,别人没环境没代码的没办法猜到哪里有问题

  • 暂无评论
年代过于久远,无法发表回答
🔝