Ver Fonte

v3.0.6 fix Timer

walkor há 10 anos atrás
pai
commit
e29ceeaaa2
3 ficheiros alterados com 15 adições e 12 exclusões
  1. 9 7
      Workerman/Events/Libevent.php
  2. 5 4
      Workerman/Events/Select.php
  3. 1 1
      Workerman/Worker.php

+ 9 - 7
Workerman/Events/Libevent.php

@@ -46,11 +46,10 @@ class Libevent implements EventInterface
      */
     public function add($fd, $flag, $func, $args=null)
     {
-        $fd_key = (int)$fd;
-        
         switch($flag)
         {
             case self::EV_SIGNAL:
+                $fd_key = (int)$fd;
                 $real_flag = EV_SIGNAL | EV_PERSIST;
                 $this->_eventSignal[$fd_key] = event_new();
                 if(!event_set($this->_eventSignal[$fd_key], $fd, $real_flag, $func, null))
@@ -80,7 +79,7 @@ class Libevent implements EventInterface
                     return false;
                 }
                 
-                $time_interval = $fd_key*1000000;
+                $time_interval = $fd*1000000;
                 if(!event_add($event, $time_interval))
                 {
                     return false;
@@ -89,6 +88,7 @@ class Libevent implements EventInterface
                 return $timer_id;
                 
             default :
+                $fd_key = (int)$fd;
                 $real_flag = $flag == self::EV_READ ? EV_READ | EV_PERSIST : EV_WRITE | EV_PERSIST;
                 
                 $event = event_new();
@@ -121,11 +121,11 @@ class Libevent implements EventInterface
      */
     public function del($fd ,$flag)
     {
-        $fd_key = (int)$fd;
         switch($flag)
         {
             case self::EV_READ:
             case self::EV_WRITE:
+                $fd_key = (int)$fd;
                 if(isset($this->_allEvents[$fd_key][$flag]))
                 {
                     event_del($this->_allEvents[$fd_key][$flag]);
@@ -137,6 +137,7 @@ class Libevent implements EventInterface
                 }
                 break;
             case  self::EV_SIGNAL:
+                $fd_key = (int)$fd;
                 if(isset($this->_eventSignal[$fd_key]))
                 {
                     event_del($this->_eventSignal[$fd_key]);
@@ -145,10 +146,11 @@ class Libevent implements EventInterface
                 break;
             case self::EV_TIMER:
             case self::EV_TIMER_ONCE:
-                if(isset($this->_eventTimer[$fd_key]))
+                // 这里 fd 为timerid 
+                if(isset($this->_eventTimer[$fd]))
                 {
-                    event_del($this->_eventTimer[$fd_key][2]);
-                    unset($this->_eventTimer[$fd_key]);
+                    event_del($this->_eventTimer[$fd][2]);
+                    unset($this->_eventTimer[$fd]);
                 }
                 break;
         }

+ 5 - 4
Workerman/Events/Select.php

@@ -77,28 +77,29 @@ class Select implements EventInterface
      */
     public function add($fd, $flag, $func, $args = null)
     {
-        // key
-        $fd_key = (int)$fd;
         switch ($flag)
         {
             case self::EV_READ:
+                $fd_key = (int)$fd;
                 $this->_allEvents[$fd_key][$flag] = array($func, $fd);
                 $this->_readFds[$fd_key] = $fd;
                 break;
             case self::EV_WRITE:
+                $fd_key = (int)$fd;
                 $this->_allEvents[$fd_key][$flag] = array($func, $fd);
                 $this->_writeFds[$fd_key] = $fd;
                 break;
             case self::EV_SIGNAL:
+                $fd_key = (int)$fd;
                 $this->_signalEvents[$fd_key][$flag] = array($func, $fd);
                 pcntl_signal($fd, array($this, 'signalHandler'));
                 break;
             case self::EV_TIMER:
             case self::EV_TIMER_ONCE:
                 // $fd 为 定时的时间间隔,单位为秒,支持小数,能精确到0.001秒
-                $run_time = microtime(true)+$fd_key;
+                $run_time = microtime(true)+$fd;
                 $this->_scheduler->insert($this->_timerId, -$run_time);
-                $this->_task[$this->_timerId] = array($func, $args, $flag, $fd_key);
+                $this->_task[$this->_timerId] = array($func, $args, $flag, $fd);
                 $this->tick();
                 return $this->_timerId++;
         }

+ 1 - 1
Workerman/Worker.php

@@ -21,7 +21,7 @@ class Worker
      * 版本号
      * @var string
      */
-    const VERSION = '3.0.5';
+    const VERSION = '3.0.6';
     
     /**
      * 状态 启动中