<?php
main();
function main()
{
$pid=pcntl_fork();
if($pid)
{
exit(0);
}
else
{
posix_setsid();
$pid=pcntl_fork();
if($pid)
{
exit(0);
}
cli_set_process_title('mysocket');
$stream_rs=stream_socket_server("tcp://127.0.0.1:2345",$errno,$errstr);
$socket = socket_import_stream($stream_rs);
socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);
socket_set_option($socket, SOL_SOCKET, TCP_NODELAY, 1);
stream_set_blocking($stream_rs, 0);
//fork 2 subprocess
$i=2;
while($i--)
{
$pid=pcntl_fork();
if($pid)
{
}
else
{
cli_set_process_title('submysocket');
$base_event=event_base_new();
$event=event_new();
event_set($event, $stream_rs, EV_READ | EV_PERSIST , "acceptConnection", null);
event_base_set($event, $base_event);
event_add($event);
event_base_loop($base_event);
}
}
$pid=pcntl_wait($stats);
echo $pid."has exit \n";
}
}
function acceptConnection($socket)
{
$new_stream = @stream_socket_accept($socket, 0);
if($new_stream===false)
{
return;
}
echo 'coming..';
stream_set_blocking($new_stream, 0);
$base_event=event_base_new();
$event=event_new();
event_set($event, $new_stream, EV_READ | EV_PERSIST , "baseRead", null);
event_base_set($event, $base_event);
event_add($event);
event_base_loop($base_event);
}
function baseRead($socket)
{
$buf='';
$buf_length=8192;
while($str=fread($socket, $buf_length))
{
$buf.=$str;
}
myecho($buf);
}
function myecho($str)
{
if (!empty($str))
echo $str;
}
?>
以上是所有源代碼,我的客戶端是telnet 127.0.0.1 2345,但是現(xiàn)在的問題是worker進(jìn)程不知道客戶端退出了,還在傻傻地等,所以想請教群主怎么修改這段代碼
我還有問題!
1. 我覺得我這個代碼在event上有問題?,F(xiàn)在的情況是,我只開了一個worker ,一旦telnet連接上服務(wù)器了,再開一個telnet的話,新開的就不會到acceptConnection函數(shù)里面去.
2.
if(feof($socket))
{
unset($socket);
return;
}
這樣寫有什么問題嗎?
還請多多指教!