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

關(guān)于優(yōu)雅退出

dmcz

通過 stop -g 或者 kill -SIGHUP 來優(yōu)雅結(jié)束進(jìn)程, 接收到信號后在onWorkerStop中該如何處理?等待業(yè)務(wù)處理完畢后exit還是把所有的連接都銷毀掉?在mqtt client中好像并沒有可以將$this->_connection設(shè)置為null的方法
偽代碼


$worker->onWorkerStop = function(){
    /**
     * @var Client
     */
    global $mqtt;

    $mqtt->disconnect();

    exit(0);
};
$worder->onWokerStop = function(){
    global $client;

    $client->destory();
    $client = null;
};
2557 4 0
4個回答

walkor 打賞

執(zhí)行到onWorkerStop 一般說明業(yè)務(wù)已經(jīng)執(zhí)行完了,可以直接執(zhí)行 Worker::stopAll() 退出當(dāng)前進(jìn)程,

  • dmcz 2022-01-05

    這樣會變成一個死循環(huán)把? 接收到信號之后就會執(zhí)行stopAll, stopAll中執(zhí)行stop再觸發(fā)onWorkerStop事件.

  • walkor 2022-01-05

    stopAll內(nèi)部有判斷,不會死循環(huán)。

  • dmcz 2022-01-06

    依然還是會死循環(huán),stopAll中 stoping 標(biāo)記的改變,是再stop()方法之后執(zhí)行的。還是我使用的方法不太對?代碼貼在樓下了。

dmcz

demo:

<?php

use Workerman\Worker;
use Workerman\Mqtt\Client;

require_once('vendor/autoload.php');

var_dump(posix_getpid());

$worker = new Worker('text://127.0.0.1:1234');

$worker->onWorkerStart = function(){
    try {
        $username = 'abc';
        $password = 'abc';
        $clientId = 'abc';

        global $mqtt;

        $mqtt = new Client('mqtt://emqx:1883', [
            'client_id' => $clientId,
            'username' => $username,
            'password' => $password,
            'debug' => true
        ]);

        $mqtt->connect();

    } catch (\Throwable $th) {
        echo (string) $th . PHP_EOL;
        return;
    }
};

$worker->onMessage = function($connection, $buffer){   
    try {
        $data = json_decode($buffer, true);
        if(empty($data)){
            throw new Exception('data error');
        }

        if(empty($data['topic']) || !is_string($data['topic']) || empty($data['message']) || !is_string($data['message']) ){
            throw new Exception('data error');
        }

        global $mqtt;

        $mqtt->publish($data['topic'], $data['message']);

    } catch (\Throwable $th) {
        echo (string) $th . PHP_EOL;
        return;
    }
};

$worker->onWorkerStop = function($worker){
    /**
     * @var Client
     */
    global $mqtt;

    if($mqtt){
        $mqtt->disconnect();
        $mqtt = null;
    }

    Worker::stopAll();
};

Worker::runAll();

也嘗試過在 Worker::stopAll() 前將$worker->onWorkerStop=null, 但是此時的連接對象并不會銷毀,沒有執(zhí)行連接對象的析構(gòu)函數(shù)里,連接數(shù)不會--,進(jìn)程依然沒有結(jié)束。

  • 暫無評論
walkor 打賞
foreach (\Workerman\Connection\TcpConnection::$connections as $connection) {
    $connection->close();
}

onWorkerStop里這樣關(guān)閉所有連接,應(yīng)該就退出了。不用再執(zhí)行Worker::stopAll();了

  • dmcz 2022-01-06

    在 $mqtt->disconnect();時連接已經(jīng)被關(guān)閉了,但是該連接的對象并沒有被銷毀,沒有在對象的析構(gòu)函數(shù)中減少連接數(shù)。

dmcz

多次嘗試之后,目前感覺需要在mqtt client中增加一個destory方法用來銷毀connection對象。使得連接數(shù)在connection對象的析構(gòu)函數(shù)中減一。
worker 偽代碼

$worker->onWorkerStop = function($worker){
    /**
     * @var Client
     */
    global $mqtt;

    if($mqtt){
        $mqtt->destory();
        $mqtt = null;
    }
};

mqtt client 偽代碼

public function destory(): void
{

        $this->disconnect();

        $this->_connection = $this->onConnect =  $this->onReconnect =  $this->onMessage =  $this->onClose =  $this->onError = null;
}

增加該方法之后 mqtt client 中部分方法可能需要做兼容可能才會更友好,比如close方法中$this->_connection->destroy()前需要對$this->_connection是否為空的判斷

  • walkor 2022-01-06

    發(fā)個pr吧

  • dmcz 2022-01-06

    ok, 我先在項目改了觀察一波

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