Libevent.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace Man\Core\Events;
  3. require_once WORKERMAN_ROOT_DIR . 'man/Core/Events/interfaces.php';
  4. /**
  5. *
  6. * libevent事件轮询库的封装
  7. * Worker类事件的轮询库
  8. *
  9. * @author walkor <worker-man@qq.com>
  10. */
  11. class Libevent implements BaseEvent
  12. {
  13. /**
  14. * eventBase实例
  15. * @var object
  16. */
  17. public $eventBase = null;
  18. /**
  19. * 记录所有监听事件
  20. * @var array
  21. */
  22. public $allEvents = array();
  23. /**
  24. * 记录信号回调函数
  25. * @var array
  26. */
  27. public $eventSignal = array();
  28. /**
  29. * 初始化eventBase
  30. * @return void
  31. */
  32. public function __construct()
  33. {
  34. $this->eventBase = event_base_new();
  35. }
  36. /**
  37. * 添加事件
  38. * @see \Man\Core\Events\BaseEvent::add()
  39. */
  40. public function add($fd, $flag, $func, $args = null)
  41. {
  42. $event_key = (int)$fd;
  43. if ($flag == self::EV_SIGNAL)
  44. {
  45. $real_flag = EV_SIGNAL | EV_PERSIST;
  46. // 创建一个用于监听的event
  47. $this->eventSignal[$event_key] = event_new();
  48. // 设置监听处理函数
  49. if(!event_set($this->eventSignal[$event_key], $fd, $real_flag, $func, $args))
  50. {
  51. return false;
  52. }
  53. // 设置event base
  54. if(!event_base_set($this->eventSignal[$event_key], $this->eventBase))
  55. {
  56. return false;
  57. }
  58. // 添加事件
  59. if(!event_add($this->eventSignal[$event_key]))
  60. {
  61. return false;
  62. }
  63. return true;
  64. }
  65. $real_flag = EV_READ | EV_PERSIST;
  66. // 创建一个用于监听的event
  67. $this->allEvents[$event_key][$flag] = event_new();
  68. // 设置监听处理函数
  69. if(!event_set($this->allEvents[$event_key][$flag], $fd, $real_flag, $func, $args))
  70. {
  71. return false;
  72. }
  73. // 设置event base
  74. if(!event_base_set($this->allEvents[$event_key][$flag], $this->eventBase))
  75. {
  76. return false;
  77. }
  78. // 添加事件
  79. if(!event_add($this->allEvents[$event_key][$flag]))
  80. {
  81. return false;
  82. }
  83. return true;
  84. }
  85. /**
  86. * 删除fd的某个事件
  87. * @see \Man\Core\Events\BaseEvent::del()
  88. */
  89. public function del($fd ,$flag)
  90. {
  91. $event_key = (int)$fd;
  92. switch($flag)
  93. {
  94. // 读事件
  95. case \Man\Core\Events\BaseEvent::EV_READ:
  96. case \Man\Core\Events\BaseEvent::EV_WRITE:
  97. if(isset($this->allEvents[$event_key][$flag]))
  98. {
  99. event_del($this->allEvents[$event_key][$flag]);
  100. }
  101. unset($this->allEvents[$event_key][$flag]);
  102. case \Man\Core\Events\BaseEvent::EV_SIGNAL:
  103. if(isset($this->eventSignal[$event_key]))
  104. {
  105. event_del($this->eventSignal[$event_key]);
  106. }
  107. unset($this->eventSignal[$event_key]);
  108. }
  109. return true;
  110. }
  111. /**
  112. * 事件轮训主循环
  113. * @see \Man\Core\Events\BaseEvent::loop()
  114. */
  115. public function loop()
  116. {
  117. event_base_loop($this->eventBase);
  118. }
  119. }