PHP异步编程:完整指南与示例

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

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

开始课程

PHP异步编程简介



传统上,PHP是一种同步语言:每个请求按顺序执行,在输入输出操作完成之前会阻塞执行。然而,随着Web应用程序性能要求的提高,PHP异步编程已成为必要。它允许处理数千个并发连接,执行并行任务,并有效利用系统资源。



在本指南中,我们将探讨PHP异步编程的实用方法:从基本概念到使用现代库和PHP 8.1+内置功能的实际示例。



异步基础:事件循环与非阻塞输入输出



任何异步应用程序的核心都是事件循环。这是一个无限循环,检查新事件(请求、数据库数据、文件)并分配其处理,而不会阻塞主线程。



同步代码的工作方式如下:

<?php// 阻塞操作 - 程序等待5秒sleep(5);echo "过去了5秒";// 以下代码仅在sleep之后执行echo "这条消息将在5秒后出现";?>


使用ReactPHP的异步方法:

<?phprequire 'vendor/autoload.php';

use React\\EventLoop\\Factory;use React\\Promise\\Promise;

$loop = Factory::create();

// 非阻塞定时器$loop->addTimer(5, function () { echo "过去了5秒";});

echo "这条消息将立即出现";$loop->run();?>


在异步版本中,代码不会阻塞:消息立即输出,而定时器在后台触发。



实践指南:从简单到复杂



1. 使用Fiber(PHP 8.1+)



Fiber 是PHP 8.1中引入的内置协程机制。它允许暂停函数的执行并在稍后恢复,而不会阻塞线程。



使用Fiber并行执行任务的示例:

<?phpfunction fetchData(string $url): Fiber{    return new Fiber(function () use ($url) {        // 模拟HTTP请求        $ch = curl_init($url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_TIMEOUT, 5);                // 暂停Fiber        Fiber::suspend(curl_exec($ch));        curl_close($ch);    });}

// 创建多个Fiber$fiber1 = fetchData('https://api.example.com/data1');$fiber2 = fetchData('https://api.example.com/data2');

// 启动Fiber$result1 = $fiber1->start();$result2 = $fiber2->start();

// 恢复执行$result1 = $fiber1->resume();$result2 = $fiber2->resume();

echo "结果1: " . $result1 . "";echo "结果2: " . $result2 . "";?>


2. 通过Amp进行异步数据库操作



Amp 是一个强大的异步编程库。让我们看一个异步连接MySQL的示例:



<?phprequire 'vendor/autoload.php';

use Amp\\Loop;use Amp\\Mysql\\ConnectionConfig;use Amp\\Mysql\\Pool;

Loop::run(function () { $config = ConnectionConfig::fromString( "host=localhost user=root password=secret db=test" ); $pool = new Pool($config); // 异步查询 - 不阻塞执行 $promise1 = $pool->query("SELECT SLEEP(2)"); $promise2 = $pool->query("SELECT 1 + 1 AS result"); // 两个查询并行执行 $result1 = yield $promise1; $result2 = yield $promise2; foreach ($result2 as $row) { echo "结果: " . $row['result'] . ""; } $pool->close();});?>


3. 在ReactPHP上创建异步HTTP服务器



完整

博客

书籍推荐