ontask接收原始投递数据,不自动反序列化;$data类型与task()所传一致,大于8kb时底层自动写入临时文件并读取,开发者无需手动处理,但需确保临时目录可写且注意资源对象不可传递。

onTask 接收的参数是原始投递数据,不自动反序列化
你在 task() 中传什么,onTask 回调里就收到什么类型的数据——数组、字符串、对象(已序列化)、null 都可能。Swoole 底层只负责传输字节流,不会帮你做 unserialize() 或 json_decode()。
常见错误现象:onTask 里直接对对象属性赋值,以为能改回 Worker 进程里的原对象;或者传了 JSON 字符串却没手动 json_decode($data) 就当数组用。
- 如果传的是对象,它只是拷贝,且已被序列化;
onTask中拿到的是反序列化后的副本,改它不影响 Worker 进程 - 传大于 8KB 的数据时,Swoole 会写入临时文件,
onTask内部自动读取并返回内容,你感知不到文件操作,但要注意磁盘权限和临时目录空间 - 数据库连接、CURL 句柄等资源型对象不可传递,会触发 PHP 致命错误,不是警告
onFinish 的 $data 是 onTask 返回值,类型由 onTask 决定
onFinish 的第三个参数 $data 不是原始投递数据,而是 onTask 中 return 的值或 $server->finish($data) 的参数。它经过 Swoole 序列化/反序列化流程,但最终类型取决于 onTask 怎么返回。
使用场景:你通常在 onTask 中处理完逻辑,然后 return 'ok' 或 return ['status' => 'success'],这些值就会作为 $data 出现在 onFinish 中。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
-
onTask没return也没调用$server->finish()→onFinish根本不会触发 -
onTask返回null,onFinish的$data就是null,不是空字符串或空数组 - 若
onTask返回一个大对象,它仍受 8KB 限制影响:超限走临时文件,但反序列化后仍是完整对象
数据大小影响传输路径,但不改变语义
Swoole 对小于 8KB 和大于 8KB 的数据采用不同传输机制,但对开发者透明——你不用判断大小再写两套逻辑。不过得知道背后发生了什么,否则遇到性能抖动或临时文件报错时会懵。
参数差异:两者都无强制类型约束,但 onTask 的 $data 是“输入”,onFinish 的 $data 是“输出”,它们之间没有自动映射关系。
- 小于 8KB:走 Unix socket 管道,快、无磁盘 I/O
- 大于 8KB:写入系统临时目录(如
/tmp),onTask启动时读取,onFinish不参与该过程 - 临时目录不可写会导致任务失败,错误日志里通常只显示 “failed to write task file”,没提权限问题
onTask 和 onFinish 不在同一个进程,无法共享内存
onTask 在 TaskWorker 进程执行,onFinish 在投递任务的那个 Worker 进程执行。这是两个独立进程,各自有独立的 PHP 运行环境、全局变量、静态属性、数据库连接。
容易踩的坑:有人在 onTask 里改了某个 static::$cache,然后指望 onFinish 能读到;或者在 onTask 里打开一个文件句柄,想在 onFinish 关闭它——都不行,进程隔离是硬边界。
- 所有跨进程通信必须通过
task()→onTask→finish()→onFinish这条链路显式传递 - 不能依赖
global、static、$_SESSION等做状态同步 - 如果真需要共享状态,得用 Redis、APCu(仅限单机)、或 Swoole\Table










