@@ -23,6 +23,9 @@ trait ChannelMethods
2323 /** @var string 通道pid列表 */
2424 protected static string $ _CHANNEL_PID_LIST = '#ChannelPidList# ' ;
2525
26+ /** @var string 通道事件列表 */
27+ protected static string $ _CHANNEL_EVENT_LIST = '#ChannelEventList# ' ;
28+
2629 /**
2730 * @var array = [channelKey => futureId]
2831 */
@@ -152,7 +155,14 @@ protected static function _ChPublish(string $key, mixed $message, bool $store =
152155 if (self ::isChannelUseSignal ()) {
153156 $ list = self ::_Get (self ::$ _CHANNEL_PID_LIST , []);
154157 foreach ($ list as $ pid ) {
155- @posix_kill ($ pid , Future::$ signal );
158+ self ::_Atomic (self ::$ _CHANNEL_EVENT_LIST , function () use ($ pid ) {
159+ // 设置通道事件标记
160+ $ channelEventList = self ::_Get (self ::$ _CHANNEL_EVENT_LIST , []);
161+ $ channelEventList [$ pid ][] = 1 ;
162+ self ::_Set (self ::$ _CHANNEL_EVENT_LIST , $ channelEventList );
163+ // 发送信号通知进程
164+ @posix_kill ($ pid , Future::$ signal );
165+ });
156166 }
157167 }
158168 return [
@@ -202,9 +212,25 @@ protected static function _ChCreateListener(string $key, string|int $workerId, C
202212 * ]
203213 */
204214 $ channel = self ::_Get ($ channelName = self ::GetChannelKey ($ key ), []);
215+ // 监听器回调函数
205216 $ callback = function () use ($ key , $ workerId , $ listener ) {
206217 // 原子性执行
207218 self ::_Atomic ($ key , function () use ($ key , $ workerId , $ listener ) {
219+ // 信号监听
220+ if (self ::isChannelUseSignal ()) {
221+ $ pid = posix_getpid ();
222+ // 获取通道事件标记列表
223+ $ channelEventList = self ::_Get (self ::$ _CHANNEL_EVENT_LIST , []);
224+ $ events = $ channelEventList [$ pid ] ?? [];
225+ // 如果没有事件标记则跳过
226+ if (!array_pop ($ events )) {
227+ return ;
228+ }
229+ // 更新通道事件标记
230+ $ channelEventList [$ pid ] = $ events ;
231+ self ::_Set (self ::$ _CHANNEL_EVENT_LIST , $ channelEventList );
232+ }
233+ // 数据回调
208234 $ channel = self ::_Get ($ channelName = self ::GetChannelKey ($ key ), []);
209235 if ((!empty ($ value = $ channel [$ workerId ]['value ' ] ?? []))) {
210236 // 先进先出
@@ -257,11 +283,19 @@ protected static function _ChRemoveListener(string $key, string|int $workerId, b
257283 Future::del ($ id );
258284 // 信号监听则注册pid
259285 if (self ::isChannelUseSignal ()) {
286+ $ pid = posix_getpid ();
287+ // 移除pid
260288 $ channelPidList = self ::_Get (self ::$ _CHANNEL_PID_LIST , []);
261- if ($ channelPidList [$ pid = posix_getpid () ] ?? null ) {
289+ if ($ channelPidList [$ pid ] ?? null ) {
262290 unset($ channelPidList [$ pid ]);
263291 self ::_Set (self ::$ _CHANNEL_PID_LIST , $ channelPidList );
264292 }
293+ // 移除事件标记
294+ $ channelEventList = self ::_Get (self ::$ _CHANNEL_EVENT_LIST , []);
295+ if ($ channelEventList [$ pid ] ?? null ) {
296+ unset($ channelEventList [$ pid ]);
297+ self ::_Set (self ::$ _CHANNEL_EVENT_LIST , $ channelEventList );
298+ }
265299 }
266300 if ($ remove ) {
267301 /**
0 commit comments