The most dangerous phrase in the language is "We've always done it this way."
— Grace Hopper

TrueAsync 的 RFC 流程

TrueAsync 正在推动通过 RFC 流程改变 PHP 内核的可能性。

主要 RFC
新 RFCDraft

Async Scheduler Hook API

作者:Edmond [HT]v0.1PHP 8.x

一种在 PHP 内核层面激活并发执行的机制。内核暴露专用钩子,使调度器实现可以放在独立的扩展中,甚至放在 PHP 代码里。

核心原则
  • 严格的 opt-in:在注册调度器之前没有任何开销
  • 兼容 Fiber:现有的 Fiber 代码继续工作,纤程会被调度器接管
  • Continuation:构建在 Fiber 机制之上的对称 A→B 上下文切换
  • 单一注册点SchedulerHook::register() 在整个引擎范围内启用并发
  • 按协程的上下文隔离:用户上下文与内部上下文分离
  • 生态系统的自由:内核只标准化激活和调度器接口,而 spawn() / await() / 通道则由实现决定
在 GitHub 上阅读 RFC
动机

为什么 PHP 需要内置异步

PHP 是最后几个仍然缺乏语言层面并发执行内置支持的主要语言之一。Python 有 asyncio,JavaScript 建立在事件循环之上,Go 有 goroutine,Kotlin 有协程。PHP 仍停留在「一个请求,一个进程」的范式中,尽管大多数实际应用把大部分时间都花在等待 I/O 上。

碎片化问题

如今 PHP 的异步存在于各个扩展中:Swoole、AMPHP、ReactPHP,每一个都有自己的生态系统和互不兼容的 API。

  • 每个扩展都要重写自己的 MySQL / PostgreSQL / Redis 驱动
  • 为 Swoole 编写的库无法在 AMPHP 上工作,反之亦然
  • 无法让内核函数(file_get_contents、curl_exec)变为非阻塞
  • 很高的入门门槛:需要学习一整套独立的生态系统

解决方案:引擎钩子

TrueAsync 在 PHP 引擎层面为并发添加了一个标准接缝。

  • 透明性:同步代码无需修改即可在协程中运行
  • 没有函数着色:无需 async/await 标记
  • 统一标准:引擎中为所有扩展提供单一的调度器接口
  • 向后兼容:现有代码继续工作

一个典型的 PHP 应用(Laravel、Symfony、WordPress)把 70–90% 的时间花在等待 I/O 上。使用协程后,这段空闲时间被高效利用:

场景
不用协程
使用协程
3 个各 20ms 的数据库查询
60ms
~22ms
HTTP + 数据库 + 文件
串行
并行
10 次 API 调用
10 × 延迟
~1 × 延迟
实际场景
Web 服务器 · FrankenPHP、RoadRunnerAPI Gateway · 并行聚合后台任务 · 并发队列实时 · WebSockets、流式传输
历史

早期的 RFC

这两个 RFC 描述了一个直接内置于内核的完整并发模型。新方法建立在它们的思想之上,但将面向用户的 API 移出内核,只在引擎中保留调度器的挂载点。

RFC #1Draft

PHP True Async

作者:Edmond [HT]v1.7PHP 8.6+

定义 PHP 并发模型的 RFC。描述了协程,spawn() / await() / suspend() 函数,Coroutine 对象,Awaitable 和 Completable 接口,协作式取消,Fiber 集成,错误处理和 graceful shutdown。

核心原则
  • 对现有代码进行最小改动即可启用并发
  • 协程保持顺序执行的错觉
  • 在 I/O 操作时自动切换协程
  • 协作式取消,「cancellable by design」
  • 为扩展提供标准的 C API
在 wiki.php.net 上阅读 RFC
RFC #2Draft

Scope 与结构化并发

作者:Edmond [HT]v1.0

True Async RFC 的扩展。引入 Scope 类,将协程的生命周期绑定到词法作用域。描述了作用域层次结构、错误传播、「僵尸」协程策略以及通过 protect() 实现的临界区。

它解决什么
  • 防止协程泄漏到作用域之外
  • 退出作用域时自动清理资源
  • 层次化取消:取消父级会取消所有子级
  • 保护临界区免受取消
  • 检测死锁和 self-await
在 wiki.php.net 上阅读 RFC

这些 RFC 如何关联

第一个 RFC 定义底层原语:协程、基础函数以及供扩展使用的 C API。第二个 RFC 增加结构化并发:管理协程组的机制,使并发代码安全且可预测。

RFC #1: True Async
RFC #2: Scope
层级
原语
管理
提供
spawn(), await(), Coroutine
Scope, TaskGroup, protect()
类比
Go goroutines, Kotlin coroutines
Kotlin CoroutineScope, Python TaskGroup
目标
运行并发代码
安全的生命周期管理

加入讨论

RFC 在 internals@lists.php.net 邮件列表和 GitHub Discussions 上讨论。也欢迎加入 Discord 上的对话。