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

模擬workerman的運行,在accept流程時卡住

dawn
<?php
$serv = stream_socket_server("tcp://0.0.0.0:2345", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);

stream_set_blocking($serv, 0);

for ($i = 0; $i < 3; $i++) {
    $pid = pcntl_fork();
    if ($pid === 0) {
        $base = event_base_new();
        $event = event_new();
        event_set($event, $serv, EV_READ | EV_PERSIST, 'accept_cb', $base);
        event_base_set($event, $base);
        event_add($event);
        event_base_loop($base);
        exit(0);
    }
}

function accept_cb($socket, $flag, $base)
{
    echo "onConnect\n";
    $conn = @stream_socket_accept($socket, 0);
    if(false === $conn)
    {
        return;
    }

    stream_set_blocking($conn, 0);

    $event = event_new();
    event_set($event, $conn, EV_READ | EV_PERSIST, 'read_cb', $base);
    event_base_set($event, $base);
    event_add($event);
}

function read_cb($conn, $flag, $base) {
    echo "onMessage\n";
    $data = fread($conn, 65535);
    $res = "hello: $data" . PHP_EOL;
    fwrite($conn, $res);
}

while(1) {
    $status = 0;
    $pid = pcntl_wait($status, WUNTRACED);
    if ($pid > 0) {
        echo "$pid onWorkerStop\n";
    }
}

在沒有用event之前,我是用一個進程來維持一個長連接,每個進程中用一個變量來動態(tài)保存這個連接,這樣連接就不會斷掉。

上面這段代碼用了event,可以執(zhí)行到accept_cb,但是這個時候連接就會斷掉。

看到workerman源碼中,是把連接存到了一個_socket屬性中,在read時,并沒有用這個屬性,是使用event傳遞的socket,一切正常。

大神請問,我這段代碼怎么拯救呢,讓它連接不斷掉。

2887 1 0
1個回答

walkor 打賞

首先你要理解為什么會斷掉。
因為accept_cb函數(shù)里面$conn是個臨時變量,函數(shù)之行完$conn就銷毀了,那么鏈接就斷開了。

  • dawn 2016-06-07

    我把accept_cb函數(shù)里的$conn 都存到一個全局數(shù)組里,這樣就不會斷開連接了。但是客戶端發(fā)送消息,服務端沒有走read_cb函數(shù)。

  • walkor 2016-06-07

    你要會舉一反三

  • dawn 2016-06-07

    恩 已經(jīng)弄明白了。event也要存起來。非常感謝!

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