<?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,一切正常。
大神請問,我這段代碼怎么拯救呢,讓它連接不斷掉。