点击(此处)折叠或打开
-
<?php
-
//守护进程化
-
daemonize();
-
-
$socket = stream_socket_server ('tcp://127.0.0.1:9998', $errno, $errstr);
-
stream_set_blocking($socket, 0);
-
$base = event_base_new();
-
$event = event_new();
-
event_set($event, $socket, EV_READ | EV_PERSIST, 'ev_accept', $base);
-
event_base_set($event, $base);
-
event_add($event);
-
event_base_loop($base);
-
-
$GLOBALS['connections'] = array();
-
$GLOBALS['buffers'] = array();
-
-
function ev_accept($socket, $flag, $base) {
-
static $id = 0;
-
-
$connection = stream_socket_accept($socket);
-
stream_set_blocking($connection, 0);
-
-
$id += 1;
-
-
$buffer = event_buffer_new($connection, 'ev_read', NULL, 'ev_error', $id);
-
event_buffer_base_set($buffer, $base);
-
event_buffer_timeout_set($buffer, 30, 30);
-
event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
-
event_buffer_priority_set($buffer, 10);
-
event_buffer_enable($buffer, EV_READ | EV_PERSIST);
-
-
// we need to save both buffer and connection outside
-
$GLOBALS['connections'][$id] = $connection;
-
$GLOBALS['buffers'][$id] = $buffer;
-
}
-
-
function ev_error($buffer, $error, $id) {
-
event_buffer_disable($GLOBALS['buffers'][$id], EV_READ | EV_WRITE);
-
event_buffer_free($GLOBALS['buffers'][$id]);
-
fclose($GLOBALS['connections'][$id]);
-
unset($GLOBALS['buffers'][$id], $GLOBALS['connections'][$id]);
-
}
-
-
function ev_read($buffer, $id) {
-
while ($read = event_buffer_read($buffer, 256)) {
-
foreach( $GLOBALS['connections'] as $ids => $conn ) {
-
if( $ids != $id ) {
-
fwrite($conn,$read);
-
}
-
}
-
}
-
}
-
-
-
function daemonize()
-
{
-
$pid = pcntl_fork();
-
if ($pid == -1)
-
{
-
die("fork(1) failed!\n");
-
}
-
elseif ($pid > 0)
-
{
-
//让由用户启动的进程退出
-
exit(0);
-
}
-
-
//建立一个有别于终端的新session以脱离终端
-
posix_setsid();
-
-
$pid = pcntl_fork();
-
if ($pid == -1)
-
{
-
die("fork(2) failed!\n");
-
}
-
elseif ($pid > 0)
-
{
-
//父进程退出, 剩下子进程成为最终的独立进程
-
exit(0);
-
}
-
}
-
- ?>