event.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. $socket = stream_socket_server ('tcp://0.0.0.0:2002', $errno, $errstr);
  3. stream_set_blocking($socket, 0);
  4. event_init();
  5. $base = event_base_new();
  6. $event = event_new();
  7. event_set($event, $socket, EV_READ | EV_PERSIST, 'ev_accept', $base);
  8. event_base_set($event, $base);
  9. event_add($event);
  10. event_base_loop($base);
  11. $GLOBALS['connections'] = array();
  12. $GLOBALS['buffers'] = array();
  13. function ev_accept($socket, $flag, $base) {
  14. static $id = 0;
  15. $connection = stream_socket_accept($socket);
  16. stream_set_blocking($connection, 0);
  17. $id += 1;
  18. $buffer = event_buffer_new($connection, 'ev_read', NULL, 'ev_error', $id);
  19. event_buffer_base_set($buffer, $base);
  20. event_buffer_timeout_set($buffer, 30, 30);
  21. event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
  22. event_buffer_priority_set($buffer, 10);
  23. event_buffer_enable($buffer, EV_READ | EV_PERSIST);
  24. // we need to save both buffer and connection outside
  25. $GLOBALS['connections'][$id] = $connection;
  26. $GLOBALS['buffers'][$id] = $buffer;
  27. }
  28. function ev_error($buffer, $error, $id) {
  29. event_buffer_disable($GLOBALS['buffers'][$id], EV_READ | EV_WRITE);
  30. event_buffer_free($GLOBALS['buffers'][$id]);
  31. fclose($GLOBALS['connections'][$id]);
  32. unset($GLOBALS['buffers'][$id], $GLOBALS['connections'][$id]);
  33. }
  34. function proc($content)
  35. {
  36. $body_header_len = 10;
  37. $start = 0;
  38. $left = strlen($content);
  39. while($left > $body_header_len)
  40. {
  41. $header = substr($content,$start,$body_header_len);
  42. if(!is_numeric($header)) {
  43. return;
  44. }
  45. $body_len = intval($header);
  46. if($body_len == 0) { //这是一个心跳包
  47. $start += $body_header_len;
  48. $left -= $body_header_len;
  49. }
  50. else
  51. {
  52. if($left >= $body_header_len + $body_len)
  53. {
  54. $body = substr($content,$start + $body_header_len,$body_len);
  55. // $this->mProcessor->onRequest($fd,$body);
  56. $start += $body_header_len + $body_len;
  57. $left -= $body_header_len + $body_len;
  58. }
  59. else {
  60. break;
  61. }
  62. }
  63. }
  64. if($start > 0)
  65. {
  66. $str = substr($content,$start);
  67. if($str === false) {
  68. return '';
  69. }
  70. else {
  71. return $str;
  72. }
  73. }
  74. return $content;
  75. }
  76. function ev_read($buffer, $id) {
  77. $content = '';
  78. while ($read = event_buffer_read($buffer, 1024))
  79. {
  80. echo $read;
  81. $content .= $read;
  82. $content = proc($content);
  83. echo $content;
  84. // var_dump($read);
  85. }
  86. }
  87. ?>