123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- <?php
- $socket = stream_socket_server ('tcp://0.0.0.0:2002', $errno, $errstr);
- stream_set_blocking($socket, 0);
- event_init();
- $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 proc($content)
- {
- $body_header_len = 10;
- $start = 0;
- $left = strlen($content);
- while($left > $body_header_len)
- {
- $header = substr($content,$start,$body_header_len);
- if(!is_numeric($header)) {
- return;
- }
- $body_len = intval($header);
- if($body_len == 0) { //这是一个心跳包
- $start += $body_header_len;
- $left -= $body_header_len;
- }
- else
- {
- if($left >= $body_header_len + $body_len)
- {
- $body = substr($content,$start + $body_header_len,$body_len);
- // $this->mProcessor->onRequest($fd,$body);
- $start += $body_header_len + $body_len;
- $left -= $body_header_len + $body_len;
- }
- else {
- break;
- }
- }
- }
- if($start > 0)
- {
- $str = substr($content,$start);
- if($str === false) {
- return '';
- }
- else {
- return $str;
- }
- }
- return $content;
- }
- function ev_read($buffer, $id) {
- $content = '';
- while ($read = event_buffer_read($buffer, 1024))
- {
- echo $read;
- $content .= $read;
- $content = proc($content);
- echo $content;
- // var_dump($read);
- }
- }
- ?>
|