PHP异步编程:初学者完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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                

博客

书籍推荐