PHP如何通过观察者模式解耦异步任务分发至Worker进程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1056个文字,预计阅读时间需要5分钟。
PHP 本身没有原生的跨进程观察者模式,直接使用 `SplObserver` 和 `SplSubject` 在 Web 请求中通知后台 Worker 是行不通的——这些只在当前进程内存中有效,Worker 进程根本收不到通知。
为什么不能在 PHP Web 层直接 notify() Worker?
Web 请求结束,整个 PHP 进程就销毁了,所有对象、观察者列表、回调函数全部消失。Worker 是另一个独立运行的 CLI 进程(比如通过 supervisord 启动的 php worker.php),它和 Web 进程之间没有共享内存或自动通信通道。
- 常见错误:在控制器里写
$event->notify(),以为 Worker 会响应——实际什么都不会发生 -
SplObserver的通知机制是同步、内存级的,不涉及序列化、网络或持久化 - 即使你把 Observer 实例传给
pcntl_fork()子进程,子进程也无法继承父进程的事件循环或监听状态
真正可行的解耦路径:用队列代替“通知”
所谓“观察者分发到 Worker”,本质是把「事件触发」和「事件响应」物理分离。可靠做法是:Web 层把事件写入持久化中间件,Worker 主动轮询或阻塞等待消费。
本文共计1056个文字,预计阅读时间需要5分钟。
PHP 本身没有原生的跨进程观察者模式,直接使用 `SplObserver` 和 `SplSubject` 在 Web 请求中通知后台 Worker 是行不通的——这些只在当前进程内存中有效,Worker 进程根本收不到通知。
为什么不能在 PHP Web 层直接 notify() Worker?
Web 请求结束,整个 PHP 进程就销毁了,所有对象、观察者列表、回调函数全部消失。Worker 是另一个独立运行的 CLI 进程(比如通过 supervisord 启动的 php worker.php),它和 Web 进程之间没有共享内存或自动通信通道。
- 常见错误:在控制器里写
$event->notify(),以为 Worker 会响应——实际什么都不会发生 -
SplObserver的通知机制是同步、内存级的,不涉及序列化、网络或持久化 - 即使你把 Observer 实例传给
pcntl_fork()子进程,子进程也无法继承父进程的事件循环或监听状态
真正可行的解耦路径:用队列代替“通知”
所谓“观察者分发到 Worker”,本质是把「事件触发」和「事件响应」物理分离。可靠做法是:Web 层把事件写入持久化中间件,Worker 主动轮询或阻塞等待消费。

