php 8.3 不支持原生多线程,仅可通过 parallel 扩展实现安全轻量的多线程(需手动安装,不依赖 zts,fpm 下不稳定);pthreads 已彻底不可用;pcntl+fork 适用于 linux/unix 下的进程级并发;swoole 协程适合 i/o 密集型场景。

PHP 8.3 本身不支持多线程,也从不提供“开箱即用”的线程能力;所谓“多线程”,全靠外部扩展实现,且每个扩展限制极严——不是所有扩展都能在 PHP 8.3 上跑,也不是所有运行环境都允许启用。
parallel 扩展:PHP 8.3 唯一推荐的现代多线程方案
parallel 是目前唯一官方维护、兼容 PHP 8.3(需 ≥8.0)、无需 ZTS 编译、支持 CLI 和 FPM(有限制)的多线程扩展。它用函数式 API 隐藏线程管理细节,比 pthreads 更安全、更轻量。
- 必须通过
pecl install parallel安装(PHP 8.3 默认不带) - 不依赖 ZTS:即使
php -i | grep "Thread Safety"显示disabled也能用 - 线程间完全隔离:不能直接访问主线程的变量、类、函数,必须靠
parallel\bootstrap()加载共享代码 - FPM 下慎用:子线程可能因请求生命周期结束而被强制终止,仅建议在 CLI 场景下稳定使用
- 示例中传参只能是标量或可序列化数组,
resource、Closure、对象实例均不支持
pthreads 扩展:PHP 8.3 上已彻底不可用
pthreads 在 PHP 7.4 之后就停止维护,与 PHP 8.0+ 的 Zend 引擎不兼容。哪怕你强行编译,也会在 php -m 中报错或导致 segfault。它的所有文档和教程对 PHP 8.3 都是无效的。
- 错误现象:
PHP Warning: Module 'pthreads' already loaded in Unknown on line 0或直接崩溃 - 根本原因:pthreads 依赖已被移除的
ZendObjectHandlers旧接口和线程局部存储(TLS)机制 - 不要尝试下载旧版
pthreads.so放进 PHP 8.3 的 extensions 目录——它不会加载,也不会报明确错误,只会静默失效
pcntl + fork:不是多线程,但能解决 80% 的并发需求
如果你只是想并行执行多个耗时任务(比如批量调用 API、处理文件),pcntl_fork() 是 PHP 8.3 最可靠的选择。它不依赖任何特殊编译模式,所有 Linux/Unix 环境默认支持,且和 ZTS 无关。
- 注意子进程必须以
exit(0)显式退出,否则会继续执行父进程后续逻辑(常见 bug) - 父进程务必调用
pcntl_wait()或pcntl_waitpid(),否则产生僵尸进程 - 无法共享内存,父子进程数据完全隔离;适合“发射即忘”型任务,不适合高频通信场景
- Windows 不支持,Mac 上部分系统调用行为略有差异,生产环境优先测 Linux
协程方案(Swoole / OpenSwoole):单线程高并发,别名“伪多线程”
如果你的瓶颈是 I/O(HTTP 请求、数据库查询、文件读写),用 Swoole 协程比硬上多线程更高效。它在 PHP 8.3 下完全可用,且无需修改业务逻辑即可将阻塞调用自动转为非阻塞。
- 必须启用 Hook:
Swoole\Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]),否则file_get_contents这类调用仍会阻塞 - 协程不是线程:没有 CPU 时间片抢占,一个协程卡死(如死循环)会导致整个进程卡住
- 不能在普通 Apache/Nginx + FPM 模式下运行,必须用
swoole_http_server或OpenSwoole\Server - 第三方库兼容性需验证:部分依赖
sleep()或全局状态的包在协程下会异常
真正麻烦的从来不是“怎么启动线程”,而是“线程间怎么传数据”“出错了谁负责回收”“超时怎么控制”“日志怎么不混在一起”。这些细节在 parallel 里要手动处理,在 pcntl 里得自己写信号监听,在 Swoole 里得配好 Coroutine\Context。选哪个方案,取决于你手上的环境权限、错误容忍度,以及愿不愿意为 10% 的性能提升多写 200 行防御代码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











