好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

workerman源码分析之启动过程[转]

 1     public static function parseCommand()
 2     {
 3         // 检查运行命令的参数
 4         global $argv;
 5         $start_file = $argv[0]; 
 6 
 7         // 命令
 8         $command = trim($argv[1]);
 9         
10         // 子命令,目前只支持-d
11         $command2 = isset($argv[2]) ? $argv[2] : '';
12         
13         // 检查主进程是否在运行
14         $master_pid = @file_get_contents(self::$pidFile);
15         $master_is_alive = $master_pid && @posix_kill($master_pid, 0);
16         if($master_is_alive)
17         {
18             if($command === 'start')
19             {
20                 self::log("Workerman[$start_file] is running");
21             }
22         }
23         elseif($command !== 'start' && $command !== 'restart')
24         {
25             self::log("Workerman[$start_file] not run");
26         }
27         
28         // 根据命令做相应处理
29         switch($command)
30         {
31             // 启动 workerman
32             case 'start':
33                 if($command2 === '-d')
34                 {
35                     Worker::$daemonize = true;
36                 }
37                 break;
38             // 显示 workerman 运行状态
39             case 'status':
40                 exit(0);
41             // 重启 workerman
42             case 'restart':
43             // 停止 workeran
44             case 'stop':
45                 // 想主进程发送SIGINT信号,主进程会向所有子进程发送SIGINT信号
46                 $master_pid && posix_kill($master_pid, SIGINT);
47                 // 如果 $timeout 秒后主进程没有退出则展示失败界面
48                 $timeout = 5;
49                 $start_time = time();
50                 while(1)
51                 {
52                     // 检查主进程是否存活
53                     $master_is_alive = $master_pid && posix_kill($master_pid, 0);
54                     if($master_is_alive)
55                     {
56                         // 检查是否超过$timeout时间
57                         if(time() - $start_time >= $timeout)
58                         {
59                             self::log("Workerman[$start_file] stop fail");
60                             exit;
61                         }
62                         usleep(10000);
63                         continue;
64                     }
65                     self::log("Workerman[$start_file] stop success");
66                     // 是restart命令
67                     if($command === 'stop')
68                     {
69                         exit(0);
70                     }
71                     // -d 说明是以守护进程的方式启动
72                     if($command2 === '-d')
73                     {
74                         Worker::$daemonize = true;
75                     }
76                     break;
77                 }
78                 break;
79             // 平滑重启 workerman
80             case 'reload':
81                 exit;
82         }
83     }
1     public static function runAll()
 2     {
 3         // 初始化环境变量
 4         self::init();
 5         // 解析命令
 6         self::parseCommand();
 7         // 尝试以守护进程模式运行
 8         self::daemonize();
 9         // 初始化所有worker实例,主要是监听端口
10         self::initWorkers();
11         //  初始化所有信号处理函数
12         self::installSignal();
13         // 保存主进程pid
14         self::saveMasterPid();
15         // 创建子进程(worker进程)并运行
16         self::forkWorkers();
17         // 展示启动界面
18         self::displayUI();
19         // 尝试重定向标准输入输出
20         self::resetStd();
21         // 监控所有子进程(worker进程)
22         self::monitorWorkers();
23     }

查看更多关于workerman源码分析之启动过程[转]的详细内容...

  阅读:40次