21CTO导读:如果 PHP 从此不再“干等”,会发生什么?一个名为 True Async 的项目正在将协程与非阻塞 I/O 直接引入 PHP 内核,目标瞄准在 PHP 8.6。这不是又一个第三方扩展,而是一场内核级的彻底变革。
一个名为True Async 的项目计划将协程与非阻塞 I/O 直接内置于 PHP 内核中,目标随 PHP 8.6 正式发布。
目前,True Async 项目已推出可运行的实验性扩展(版本v0.9.3,2026年8月13日更新),支持 70+ 原生函数非阻塞化、PDO 连接池,甚至内置了高性能 HTTP 服务器。
Async项目网址:https://true-async.github.io/
过去,PHP 应用若想实现并发,比如同时请求多个 API 或在文件 I/O 时查询数据库,必须依赖 Swoole、AMPHP 或 ReactPHP 等第三方扩展。
而 True Async 走了一条内核改造的道路:直接在 PHP 引擎层面重建并发模型。
01 为什么需要异步?
传统 PHP-FPM 的工作模式好比一家高档餐厅:每张餐桌都配备一名专属服务员。每个请求由独立的 PHP 进程或线程处理,请求结束后状态清空销毁。
优势:极高隔离性,单次请求的内存泄漏或未关闭链接不会影响他人,开发与调试极简。
劣势:服务员大部分时间都在等待厨房(I/O 等待)。进程频繁创建、销毁与上下文切换,资源开销巨大。
并发模型则像一名高效服务员同时照看多张桌子:当 1 号桌的菜品还在厨房准备时,服务员利用这段空闲时间去给 2 号桌点单。
串行与并发的写法对比:
1. 传统串行写法(总耗时长:300ms + 150ms + 200ms = 650ms)
$user = file_get_contents('https://api/user/123');// 阻塞 300ms$orders = $db->query('SELECT * FROM orders');// 阻塞 150ms$balance = file_get_contents('https://api/balance');// 阻塞 200ms
2. True Async 并发写法(总耗时长:接近最慢单任务的 300ms)
use function Async\spawn;use function Async\await;$userTask = spawn(file_get_contents(...), 'https://api/user/123');$ordersTask = spawn($db->query(...), 'SELECT * FROM orders');$balanceTask = spawn($db->query(...), 'SELECT * FROM balance');$user = await($userTask);$orders = $db->await($ordersTask);$balance = await($balanceTask);
核心成本效益:原本需要 650ms 的串行耗时,并发后直接缩短至 300ms。
02 同步编写,异步运行:无“函数染色”困扰
但是,如果你写过 JavaScript 或 Python 的 async/await,一定深知“函数染色”的痛苦——一旦某个底层函数变成异步,整条调用链上的所有上层函数都必须强制加上 async 关键字。
True Async 最大的亮点在于对原有代码“零侵入”:
无 async 关键字:普通同步代码可以直接运行在协程中。
内核深度适配:通过改写 Zend 内核、I/O 层、Socket 层与数据库层,实现自动非阻塞。
单线程协作式调度:CPU 在 I/O 等待期间自动切换协程,保持了 PHP 一贯的单线程简单性。
// 并发任务组与超时控制示例$page = spawn(fn() =>file_get_contents($url));$rows = spawn(fn() => $pdo->query($sql)->fetchAll());$stats = spawn(fn() =>file_get_contents($api));// 等待全部完成,支持超时自动取消[$html,$data,$meta] = await_all_or_fail([$page,$rows,$stats],timeout(2000));
03 核心 API 与架构概念
整套并发机制围绕四个核心概念展开:spawn():创建一个协程(可暂停、可恢复的轻量级执行单元)。
await():挂起当前协程,等待目标协程执行完毕并返回结果。
Scope(作用域):生命周期管理单元,当组内某一协程失败时可批量取消其余任务。
安全取消机制:协程取消时不会产生半成品状态数据,保障数据一致性。
04 70+ 原生函数自动非阻塞
在协程内部,已有超过 70 个 PHP 内核标准函数实现了自动非阻塞;而在协程外部,它们保持原有同步行为不变:
| 模块分类 | 已支持非阻塞的函数 / 驱动 |
| 网络与请求 | cURL、Socket、流套接字、gethostbyname() 等 DNS 解析 |
| 数据库 | PDO MySQL / PgSQL、MySQLi、原生 PostgreSQL 驱动 |
| 文件与流 | fopen()、fread()、file_put_contents()、flock() |
| 进程控制 | proc_open()、exec()、shell_exec() |
| 定时与缓存 | sleep()、usleep()、独立的协程输出缓冲区(Buffer) |
注:对于 flock() 等天生阻塞的系统调用,内核会自动将其转交给底层线程池处理,确保主协程不受阻塞。目前仅 mkdir()、opendir() 及 SQLite 驱动等低优先级文件系统操作暂时未覆盖。
05 实验性扩展功能现状 (v0.9.3)
True Async 并非停留在提案阶段,其 v0.9.3 实验性内核已包含以下完整能力:
内置数据库连接池:原生 PDO 连接自动复用管理。
多线程支持:通过 spawn_thread() 支持原生线程,专门用于处理 CPU 密集型计算。
纯 C 实现 HTTP 服务器:内置 HTTP/1.1、HTTP/2、HTTP/3 服务器,可直接独立运行。
框架生态适配:自 v0.9.0 起已提供 Symfony 适配器与迁移指南,逐步推进现有生态平滑接入。
开发者可通过官方提供的 true-async/ide-helper Composer 包,在 PhpStorm、PHPStan 中获得完整的自动补全与类型检查支持。
06 路线图与落地时间
官方计划于 2026 年 11 月 发布稳定 v1.0 版本,时间线与 PHP 8.6 对齐:
PHP 8.6 Alpha 1:2026 年 7 月 2 日(已经发布)
PHP 8.6 Beta 1:2026 年 8 月中旬
PHP 8.6 正式版:预计 2026 年 11 月 19 日
友情提示:作为大规模内核改造提案,True Async 是否能最终随 PHP 8.6 正式打包合并,仍需等待核心开发团队在发布临近阶段的投票确认。
结语
PHP 的每一次内核进化都在重溯它的适用边界。
True Async 能否成功进入 8.6 正式版尚有待观察,但信号已经极其明确:PHP 正在将“简单”延伸至并发时代。
作者:场长
参考:
https://medium.com/codex/true-async-native-php-concurrency-targeting-php-8-6-ba75e8bda096
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。