国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

GatewayClient運行10幾分鐘后出錯

dignfei

一開始正常,運行10分鐘后,就會出錯,Gateway::getAllGroupIdList()返回的數(shù)據(jù)會缺失一部分。
環(huán)境:php8.0.1到8.0.7都會出現(xiàn)這個問題。
提取了可重現(xiàn)代碼如下:

<?php

use GatewayClient\Gateway;
use Swoole\Process;

require __DIR__.'/../vendor/autoload.php';

$Test = new test();
$Test->SwooleRundebug2();

class test{
    public function SwooleRundebug2(){
        // 監(jiān)聽一個http端口,端口只暴露給nginx
        global $Server;
        $Server = new Swoole\Http\Server('0.0.0.0', 16985); // SWOOLE_BASE 不支持reload
        $Server->set(['enable_coroutine' => false,'worker_num'      => 1,]);
        $Server->on('WorkerStart', function ($server, $worker_id){
            Swoole\Timer::tick(3000, function () {
                $this->subProcess();
            });
        });
        $Server->on('request', function ($request, $response){
        });
        $Server->start();
    }
    public function subProcess()
    {
        Swoole\Process::wait(false);
        // 開啟子線程
        $process = new Process(function (Process $proc)  {
            echo '開始運行一次',  date('Y-m-d H:i:s');
            // 運行這個 獲取rooms
            Gateway::$registerAddress = '127.0.0.1:9138';
            $rooms = Gateway::getAllGroupIdList();
            var_dump($rooms);
            if(empty($rooms)){
                Gateway::$registerAddress = '127.0.0.1:9138';// 這里打斷點,方便調(diào)試
                $rooms = Gateway::getAllGroupIdLsist();
            }
            $proc->exit();
        }, false, 1, true);
        $process->start();
    }
}

經(jīng)過xdebug調(diào)試發(fā)現(xiàn),在 vendor\workerman\gatewayclient\Gateway.php的方法

protected static function getBufferFromGateway($gateway_buffer_array)

中的這一段代碼有問題

while (count($client_array) > 0) {
            $write = $except = array();
            $read  = $client_array;
            if (@stream_select($read, $write, $except, $timeout)) {
                foreach ($read as $client) {
                    $socket_id = (int)$client;
                    $buffer    = stream_socket_recvfrom($client, 65535);
                    if ($buffer !== '' && $buffer !== false) {
                        $receive_buffer_array[$socket_id] .= $buffer;
                        $receive_length = strlen($receive_buffer_array[$socket_id]);
                        if (empty($recv_length_array[$socket_id]) && $receive_length >= 4) {
                            $recv_length_array[$socket_id] = current(unpack('N', $receive_buffer_array[$socket_id]));
                        }
                        if (!empty($recv_length_array[$socket_id]) && $receive_length >= $recv_length_array[$socket_id] + 4) {
                            unset($client_array[$socket_id]);
                        }
                    } elseif (feof($client)) {
                        unset($client_array[$socket_id]);
                    }
                }
            }
            if (microtime(true) - $time_start > $timeout) {
                break;
            }
        }

這里會訪問4個端口獲取數(shù)據(jù),但是只有一個端口能得到數(shù)據(jù),其他的端口獲取不到數(shù)據(jù)。求大佬解決 @walkor

2367 2 0
2個回答

walkor 打賞

有問題的時候運行status截圖下,截圖截全。

  • dignfei 2021-07-29

    運行status是什么意思?執(zhí)行什么代碼?

  • yongdao35 2021-07-30

    php start.php status 吧

  • hachiko6177 2021-09-23

    常駐內(nèi)存下 Gateway client 出問題了 ,會拿不到數(shù)據(jù),不知道和 socket 沒有 close 有沒有關(guān)系

yongdao35

Gateway::getAllGroupIdList() 是返回在線的分組id,10分鐘后只返回部分,我猜測是因為有的分組id沒有連接在線了。

  • dignfei 2021-07-30

    都連接在線,新打開一個shell運行php,就都能讀取到

年代過于久遠,無法發(fā)表回答
??