@@ -14,35 +14,88 @@ class ProcManager
14
14
{
15
15
use AutoConfigTrait;
16
16
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
+
17
34
/**
18
- * @var callable
35
+ * hooks on error
36
+ * - param#1 is PID.
37
+ *
38
+ * @var callable(int): void
19
39
*/
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 ;
21
49
22
50
private int $ procNum = 1 ;
23
51
52
+ /**
53
+ * @var bool
54
+ */
55
+ private bool $ daemon = false ;
56
+
24
57
/**
25
58
* @var string custom process name
26
59
*/
27
60
private string $ procName = '' ;
28
61
62
+ /**
63
+ * @return $this
64
+ */
29
65
public function run (): self
30
66
{
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 ' );
33
81
82
+ // wait child exit.
83
+ ProcessUtil::wait ($ this ->onExit );
84
+ } catch (\Throwable $ e ) {
85
+
86
+ }
34
87
35
88
return $ this ;
36
89
}
37
90
38
91
/**
39
- * @param callable $handler
92
+ * @param callable $workHandler
40
93
*
41
94
* @return $this
42
95
*/
43
- public function setHandler (callable $ handler ): self
96
+ public function setWorkHandler (callable $ workHandler ): self
44
97
{
45
- $ this ->handler = $ handler ;
98
+ $ this ->workHandler = $ workHandler ;
46
99
return $ this ;
47
100
}
48
101
@@ -65,4 +118,53 @@ public function setProcNum(int $procNum): self
65
118
$ this ->procNum = $ procNum ;
66
119
return $ this ;
67
120
}
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
+ }
68
170
}
0 commit comments