فهرست منبع

no_reload no_debug SIGTTOU

liangl 11 سال پیش
والد
کامیت
fb0926e0d3

+ 0 - 1
applications/FileReceiverDemo/FileReceiverDemo.php

@@ -61,7 +61,6 @@ class FileReceiverDemo extends Man\Core\SocketWorker
      */
     public function dealProcess($buffer)
     {
-        // unsigned int + unsigned char 共5字节
         $head_len = 5;
         // 解包
         $message_data = unpack("Nmessage_len/Cmessage_type", $buffer);

+ 1 - 1
workerman/Common/FileMonitor.php

@@ -159,7 +159,7 @@ class FileMonitor extends Man\Core\AbstractWorker
             // 日志
             $this->notice("terminal closed and restart worker");
             // worker重启时会检测终端是否关闭
-            $this->sendSignalToAllWorker(SIGHUP);
+            $this->sendSignalToAllWorker(SIGTTOU);
             // 设置标记
             $this->terminalClosed = true;
         }

+ 19 - 1
workerman/Core/AbstractWorker.php

@@ -91,12 +91,12 @@ abstract class AbstractWorker
         // 报告进程状态
         pcntl_signal(SIGINT, array($this, 'signalHandler'));
         pcntl_signal(SIGHUP, array($this, 'signalHandler'));
+        pcntl_signal(SIGTTOU, array($this, 'signalHandler'));
         // 设置忽略信号
         pcntl_signal(SIGALRM, SIG_IGN);
         pcntl_signal(SIGUSR1, SIG_IGN);
         pcntl_signal(SIGUSR2, SIG_IGN);
         pcntl_signal(SIGTTIN, SIG_IGN);
-        pcntl_signal(SIGTTOU, SIG_IGN);
         pcntl_signal(SIGQUIT, SIG_IGN);
         pcntl_signal(SIGPIPE, SIG_IGN);
         pcntl_signal(SIGCHLD, SIG_IGN);
@@ -117,6 +117,10 @@ abstract class AbstractWorker
             case SIGHUP:
                 $this->workerStatus = self::STATUS_SHUTDOWN;
                 break;
+                // 终端关闭
+            case SIGTTOU:
+                $this->resetFd();
+                break;
         }
     }
     
@@ -262,6 +266,20 @@ abstract class AbstractWorker
         }
     }
     
+    /**
+     * 关闭标准输入输出
+     * @return void
+     */
+    protected function resetFd()
+    {
+        global $STDOUT, $STDERR;
+        @fclose(STDOUT);
+        @fclose(STDERR);
+        // 将标准输出重定向到/dev/null
+        $STDOUT = fopen('/dev/null',"rw+");
+        $STDERR = fopen('/dev/null',"rw+");
+    }
+    
 }
 
 

+ 22 - 7
workerman/Core/Master.php

@@ -396,9 +396,9 @@ class Master
             {
                 self::setWorkerUser($worker_user);
             }
-    
+            
             // 关闭输出
-            self::resetStdFd();
+            self::resetStdFd(Lib\Config::get($worker_name.'.no_debug'));
     
             // 尝试设置子进程进程名称
             self::setWorkerProcessTitle($worker_name);
@@ -512,7 +512,18 @@ class Master
             case SIGHUP:
                 Lib\Config::reload();
                 self::notice("Server reloading");
-                self::addToRestartWorkers(array_keys(self::getPidWorkerNameMap()));
+                $pid_worker_name_map = self::getPidWorkerNameMap();
+                $pids_to_restart = array();
+                foreach($pid_worker_name_map as $pid=>$worker_name)
+                {
+                    // 如果对应进程配置了不热启动则不重启对应进程
+                    if(Lib\Config::get($worker_name.'.no_reload'))
+                    {
+                        continue;
+                    }
+                    $pids_to_restart[] = $pid;
+                }
+                self::addToRestartWorkers($pids_to_restart);
                 self::restartWorkers();
                 break;
         }
@@ -831,12 +842,16 @@ class Master
      * 关闭标准输入输出
      * @return void
      */
-    protected static function resetStdFd()
+    protected static function resetStdFd($force = false)
     {
-        // 开发环境不关闭标准输出,用于调试
-        if(Lib\Config::get('workerman.debug') == 1 && posix_ttyname(STDOUT))
+        // 如果此进程配置是no_debug,则关闭输出
+        if(!$force)
         {
-            return;
+            // 开发环境不关闭标准输出,用于调试
+            if(Lib\Config::get('workerman.debug') == 1 && posix_ttyname(STDOUT))
+            {
+                return;
+            }
         }
         global $STDOUT, $STDERR;
         @fclose(STDOUT);

+ 15 - 1
workerman/Core/SocketWorker.php

@@ -464,10 +464,11 @@ abstract class SocketWorker extends AbstractWorker
         $this->event->add(SIGUSR1, Events\BaseEvent::EV_SIGNAL, array($this, 'signalHandler'));
         // 报告该进程使用的文件
         $this->event->add(SIGUSR2, Events\BaseEvent::EV_SIGNAL, array($this, 'signalHandler'));
+        // 关闭标准输入输出
+        $this->event->add(SIGTTOU, Events\BaseEvent::EV_SIGNAL, array($this, 'signalHandler'));
         
         // 设置忽略信号
         pcntl_signal(SIGTTIN, SIG_IGN);
-        pcntl_signal(SIGTTOU, SIG_IGN);
         pcntl_signal(SIGQUIT, SIG_IGN);
         pcntl_signal(SIGPIPE, SIG_IGN);
         pcntl_signal(SIGCHLD, SIG_IGN);
@@ -492,8 +493,17 @@ abstract class SocketWorker extends AbstractWorker
                 break;
             // 停止该进程
             case SIGINT:
+                $this->stop();
+                // EXIT_WAIT_TIME秒后退出进程
+                pcntl_alarm(self::EXIT_WAIT_TIME);
+                break;
             // 平滑重启
             case SIGHUP:
+                // 如果配置了no_reload则不重启该进程
+                if(\Man\Core\Lib\Config::get($this->workerName.'.no_reload'))
+                {
+                    return;
+                }
                 $this->stop();
                 // EXIT_WAIT_TIME秒后退出进程
                 pcntl_alarm(self::EXIT_WAIT_TIME);
@@ -506,6 +516,10 @@ abstract class SocketWorker extends AbstractWorker
             case SIGUSR2:
                 $this->writeFilesListToQueue();
                 break;
+            // FileMonitor检测到终端已经关闭,向此进程发送SIGTTOU信号,关闭此进程的标准输入输出
+            case SIGTTOU:
+                $this->resetFd();
+                break;
         }
     }
     

+ 4 - 1
workerman/conf/conf.d/FileReceiverDemo.conf

@@ -10,4 +10,7 @@ start_workers=5
 user=root
 ;预读长度 unsigned int + unsigned char 共5字节
 preread_length=5
-
+;是否有文件更新时reload此进程
+no_reload = 0 
+;是否关闭此进程的debug
+no_debug = 0 

+ 1 - 1
workerman/conf/workerman.conf

@@ -1,5 +1,5 @@
 ;debug=1则var_dump、echo、php notcie等会在终端上打印出来
-debug=0
+debug=1
 ;保存主进程pid的文件
 pid_file=/var/run/workerman.pid
 ;日志文件目录