17611538698
webmaster@21cto.com

PHP 8.6 将迎来原生并发:原生 70+ 函数自动非阻塞

编程语言 0 20 1小时前
图片

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-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 内核标准函数实现了自动非阻塞;而在协程外部,它们保持原有同步行为不变:

模块分类已支持非阻塞的函数 / 驱动
网络与请求cURLSocket、流套接字、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 实验性内核已包含以下完整能力:

  1. 内置数据库连接池:原生 PDO 连接自动复用管理。

  2. 多线程支持:通过 spawn_thread() 支持原生线程,专门用于处理 CPU 密集型计算。

  3. 纯 C 实现 HTTP 服务器:内置 HTTP/1.1、HTTP/2、HTTP/3 服务器,可直接独立运行。

  4. 框架生态适配:自 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

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信