PHP事件驱动本质是Observer模式解耦,核心为Subject、Observer接口及注册/通知机制;Laravel事件应传最小必要数据;Swoole异步需注意fd类型、回调作用域及事件清理。
PHP 本身没有原生事件循环(像 Node.js 那样),但“事件驱动”在 PHP 中通常指用
模式解耦业务逻辑,让对象在状态变化时通知监听者——这不是靠底层 I/O 多路复用,而是靠显式触发和委托。
怎么手动实现一个轻量级 Observer(不依赖框架)
核心是三要素:被观察者(
)、观察者接口(
)、注册/通知机制。别直接写全局
函数,那会破坏封装。
类需维护
数组,提供
、
和
是接口,强制实现
,避免类型模糊
通知时传具体事件名(如
)而非仅传状态,方便观察者按需响应
避免在
中做耗时操作(如发邮件、调 API),应投递到队列或用
异步(仅 CLI 场景)
为什么不要在 Laravel 的
里传大数组
Laravel 的事件系统本质仍是同步调用,传入超大
(比如整个
模型 + 关联数据)会导致内存陡增、GC 压力大,且违反“事件只传递关键上下文”的原则。
只传必要标识:如
,让监听器自己查库或从缓存取
模型序列化后传
而非对象实例,避免闭包、资源句柄等不可序列化字段报错
若监听器需原始模型,改用
+
等 Eloquent 事件,更轻量
使用
做真异步事件要注意什么
这是少数能让 PHP 接近“真正事件驱动”的方式,但仅限 CLI 模式,且必须理解其与传统 FPM 的根本差异。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
不能在
回调里直接 echo 或 var_dump —— Swoole 不走 PHP-FPM 输出流,要调
注册的事件回调函数必须是静态方法或闭包,普通对象方法会因作用域丢失导致
的 fd 必须是 socket 文件描述符(如
返回值),不能是普通文件句柄或 cURL 句柄
每次
后需手动清理已触发事件,否则可能重复执行;建议配合
使用
观察者模式的价值不在“酷”,而在让
不用知道发短信、写日志、更新搜索索引这些事——但这也意味着你得主动管理观察者的生命周期,否则内存泄漏比想象中来得快。
ObserverSubjectObserverevent_emit()Subject$observersattach()detach()notify()Observerupdate(Subject $subject, string $event, mixed $data)'user.registered'notify()pcntl_fork()Event::dispatch()$dataUser['user_id' => 123]toArray()static::observe(User::class)created()Swoole\Event::wait()onReceive$server->send()Fatal error: Call to undefined methodSwoole\Event::add()fsockopen()Event::wait()Event::del()UserService