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源码分析之启动过程[转]的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did31394