php 的 libevent库,到pecl找
<?php class epoll{ private static $socket; private static $connections; private static $buffers; function epoll($port){ if($port<1024) die("Port must be a number which bigger than 1024/n"); self::$socket = stream_socket_server ('tcp://0.0.0.0:'.$port, $errno, $errstr); stream_set_blocking(self::$socket, 0); $base = event_base_new(); $event = event_new(); event_set($event, self::$socket , EV_READ | EV_PERSIST, 'epoll::ev_accept', $base); event_base_set($event, $base); event_add($event); event_base_loop($base); self::$connections = array(); self::$buffers = array(); } public static 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, 'epoll::ev_read', NULL, 'epoll::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 self::$connections[$id] = $connection; echo 'In-> $id='.$id.',$connection='.$connection."/n"; self::$buffers[$id] = $buffer; } public static function ev_error($buffer, $error, $id) { event_buffer_disable(self::$buffers[$id], EV_READ | EV_WRITE); event_buffer_free(self::$buffers[$id]); echo 'Ot-> $id='.$id."/n"; fclose(self::$connections[$id]); unset(self::$buffers[$id], self::$connections[$id]); } public static function ev_read($buffer, $id) { static $ct=0; static $ct1=0; while ($read = event_buffer_read($buffer, 256)) { $ct+=strlen($read); if(strpos($read,'ct')!==false) echo 'Ct=>'.count(self::$connections).'/n'; if($ct-10240>$ct_last){ $ct_last=$ct; echo (ceil($ct/1024)*10)." K/n"; } } } } new epoll($argv[1]); ?>