PHP 异步编程简介
传统上,PHP 以同步模式运行:每个请求按顺序逐行执行。然而,在现代 Web 开发中,越来越需要同时处理多个任务——从发送邮件到处理 WebSocket 和 API。PHP 异步编程 可以在不阻塞主执行流的情况下高效解决这些问题。
在本教程中,我们将探讨什么是异步、为什么需要它,以及如何在 PHP 中开始使用它。您将了解关键工具:Fiber、ReactPHP、Swoole 以及用于处理协程的内置函数。
什么是异步编程,为什么需要它?
同步代码 vs 异步代码
想象一下您正在点披萨。同步方式:您打电话,等待披萨做好,然后才挂断电话。异步方式:您打电话下单,在披萨制作期间——您可以做自己的事情。在 PHP 中,这看起来像这样:
// 同步代码(阻塞)$data = file_get_contents('https://api.example.com');echo "数据已获取:" . $data; // 等待加载完成
// 异步代码(非阻塞)$promise = async_file_get_contents('https://api.example.com');echo "请求已发送,可以处理其他事务...";$data = await($promise); // 稍后获取结果同步 PHP 的问题
- I/O 阻塞:文件、数据库或网络请求操作会停止脚本执行
- 性能低下:每个新请求都需要单独的进程或线程
- 实时性问题:聊天、通知和流媒体效率低下
异步方法的优势
- 同时处理成百上千个连接
- 节省服务器内存和资源
- 能够创建实时应用程序
- 更灵敏的界面
异步 PHP 的主要工具
1. 协程和 Fiber(PHP 8.1+)
从 PHP 8.1 开始,内置了对 Fiber(轻量级协程)的支持。Fiber 允许暂停函数执行并在稍后恢复,而不会阻塞主线程。
<?php$fiber = new Fiber(function(): void { $value = Fiber::suspend('first'); echo "以值恢复:$value";});
$value = $fiber->start();echo "初始值:$value"; // first$fiber->resume('second'); // 以值恢复:second?>2. ReactPHP — PHP 的事件循环
ReactPHP 是一个实现事件驱动编程(event loop)的库。它允许执行非阻塞 I/O 操作。
<?phprequire 'vendor/autoload.php';
$loop = React\\EventLoop\\Loop::get();
$loop->addTimer(1.0, function () { echo "1 秒过去了";});
$loop->addTimer(2.0, function () { echo "2 秒过去了";});
echo "开始...";$loop->run();?>ReactPHP 还提供异步 HTTP 客户端和服务器:
<?php$browser = new React\\Http\\Browser($loop);
$browser->get('https://api.example.com')->then( function (Psr\\Http\\Message\\ResponseInterface $response) { echo "响应:" . $response->getBody(); }, function (Exception $e) { echo "错误:" . $e->getMessage(); });?>3. Swoole — 高性能异步服务器
Swoole 是一个 PHP 扩展,将其转变为一个完整的异步服务器。它支持协程、WebSocket、TCP/UDP 服务器等更多功能。
<?ph