@@ -14,35 +14,88 @@ class ProcManager
1414{
1515 use AutoConfigTrait;
1616
17+ public const ON_WORKER_START = 'workerStart ' ;
18+ public const ON_WORKER_STOP = 'workerStop ' ;
19+ public const ON_WORKER_ERROR = 'workerError ' ;
20+ public const ON_WORKER_EXIT = 'workerExit ' ;
21+
22+ public const BEFORE_START_WORKERS = 'beforeStartWorkers ' ;
23+
24+ public const AFTER_START_WORKERS = 'afterStartWorkers ' ;
25+
26+ /**
27+ * hooks on sub-process started.
28+ * - param#1 is PID. param#2 is index.
29+ *
30+ * @var callable(int, int): void
31+ */
32+ private $ workHandler ;
33+
1734 /**
18- * @var callable
35+ * hooks on error
36+ * - param#1 is PID.
37+ *
38+ * @var callable(int): void
1939 */
20- private $ handler ;
40+ private $ onError ;
41+
42+ /**
43+ * hooks on child exit
44+ * - param#1 is PID.
45+ *
46+ * @var callable(int): void
47+ */
48+ private $ onExit ;
2149
2250 private int $ procNum = 1 ;
2351
52+ /**
53+ * @var bool
54+ */
55+ private bool $ daemon = false ;
56+
2457 /**
2558 * @var string custom process name
2659 */
2760 private string $ procName = '' ;
2861
62+ /**
63+ * @return $this
64+ */
2965 public function run (): self
3066 {
31- Assert::notNull ($ this ->handler , 'process: logic handler must be set before run ' );
32- $ handler = $ this ->handler ;
67+ $ handler = $ this ->workHandler ;
68+ Assert::notNull ($ handler , 'process: logic handler must be set before run ' );
69+
70+ try {
71+ // set process name.
72+ if ($ this ->procName ) {
73+ ProcessUtil::setTitle ($ this ->procName );
74+ }
75+
76+ // create processes
77+ $ pidInfo = ProcessUtil::forks ($ this ->procNum , $ handler , $ this ->onError );
78+
79+ // in parent process.
80+ Assert::notEmpty ($ pidInfo , 'create process failed ' );
3381
82+ // wait child exit.
83+ ProcessUtil::wait ($ this ->onExit );
84+ } catch (\Throwable $ e ) {
85+
86+ }
3487
3588 return $ this ;
3689 }
3790
3891 /**
39- * @param callable $handler
92+ * @param callable $workHandler
4093 *
4194 * @return $this
4295 */
43- public function setHandler (callable $ handler ): self
96+ public function setWorkHandler (callable $ workHandler ): self
4497 {
45- $ this ->handler = $ handler ;
98+ $ this ->workHandler = $ workHandler ;
4699 return $ this ;
47100 }
48101
@@ -65,4 +118,53 @@ public function setProcNum(int $procNum): self
65118 $ this ->procNum = $ procNum ;
66119 return $ this ;
67120 }
121+
122+ /**
123+ * @return bool
124+ */
125+ public function isDaemon (): bool
126+ {
127+ return $ this ->daemon ;
128+ }
129+
130+ /**
131+ * @param bool $daemon
132+ *
133+ * @return ProcManager
134+ */
135+ public function setDaemon (bool $ daemon ): self
136+ {
137+ $ this ->daemon = $ daemon ;
138+ return $ this ;
139+ }
140+
141+ /**
142+ * @return string
143+ */
144+ public function getProcName (): string
145+ {
146+ return $ this ->procName ;
147+ }
148+
149+ /**
150+ * @param string $procName
151+ *
152+ * @return ProcManager
153+ */
154+ public function setProcName (string $ procName ): self
155+ {
156+ $ this ->procName = $ procName ;
157+ return $ this ;
158+ }
159+
160+ /**
161+ * @param callable $onError
162+ *
163+ * @return ProcManager
164+ */
165+ public function setOnError (callable $ onError ): self
166+ {
167+ $ this ->onError = $ onError ;
168+ return $ this ;
169+ }
68170}
0 commit comments