浅析PHP如何并行异步处理HTTP请求

张开发
2026/5/3 15:28:52 15 分钟阅读
浅析PHP如何并行异步处理HTTP请求
在 PHP 中由于其传统的同步阻塞模型实现并行异步处理 HTTP 请求并不像其他语言如 Go 或 Node.js那样直接。不过仍然可以通过一些扩展和工具来实现并行异步处理。以下是几种常见的方法1. 使用 cURL 的多线程功能PHP 的 cURL 扩展支持多线程处理可以通过 curl_multi_* 系列函数实现并行 HTTP 请求。示例代码123456789101112131415161718192021222324252627282930313233$urls [https://example.com/api/1,https://example.com/api/2,https://example.com/api/3,];$mh curl_multi_init();// 初始化多线程 cURL$handles [];foreach($urlsas$url) {$ch curl_init();curl_setopt($ch, CURLOPT_URL,$url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_multi_add_handle($mh,$ch);// 将单个 cURL 句柄添加到多线程中$handles[] $ch;}$running null;do{curl_multi_exec($mh,$running);// 执行并行请求curl_multi_select($mh);// 等待活动}while($running 0);$responses [];foreach($handlesas$ch) {$responses[] curl_multi_getcontent($ch);// 获取每个请求的响应curl_multi_remove_handle($mh,$ch);// 移除句柄curl_close($ch);}curl_multi_close($mh);// 关闭多线程 cURLprint_r($responses);优点原生支持无需额外扩展。可以并行处理多个 HTTP 请求。缺点代码复杂度较高。需要手动管理句柄和状态。2. 使用 Guzzle 异步客户端Guzzle 是一个流行的 PHP HTTP 客户端库支持异步请求。示例代码123456789101112131415161718192021222324252627requirevendor/autoload.php;useGuzzleHttp\Client;useGuzzleHttp\Promise;$clientnewClient();$urls [https://example.com/api/1,https://example.com/api/2,https://example.com/api/3,];$promises [];foreach($urlsas$url) {$promises[] $client-getAsync($url);// 发起异步请求}$responses Promise\Utils::settle($promises)-wait();// 等待所有请求完成foreach($responsesas$response) {if($response[state] fulfilled) {echo$response[value]-getBody() .\n;// 输出响应内容}else{echoRequest failed: .$response[reason]-getMessage() .\n;}}优点代码简洁易于使用。支持并发请求和异步处理。缺点需要安装 Guzzle 库。3. 使用 Swoole 扩展Swoole 是一个高性能的 PHP 扩展支持异步、协程和并行处理。示例代码123456789101112131415161718192021Swoole\Runtime::enableCoroutine();// 启用协程$urls [https://example.com/api/1,https://example.com/api/2,https://example.com/api/3,];$responses [];go(function()use($urls, $responses) {$clientnewSwoole\Coroutine\Http\Client(example.com, 443, true);foreach($urlsas$url) {$client-get($url);$responses[] $client-body;}});Swoole\Event::wait();// 等待所有协程完成print_r($responses);优点高性能支持协程和异步 I/O。适合高并发场景。缺点需要安装 Swoole 扩展。学习曲线较高。4. 使用 ReactPHPReactPHP 是一个基于事件驱动的 PHP 库支持异步编程。示例代码1234567891011121314151617181920212223242526requirevendor/autoload.php;useReact\EventLoop\Factory;useReact\HttpClient\Client;useReact\HttpClient\Response;$loop Factory::create();$clientnewClient($loop);$urls [https://example.com/api/1,https://example.com/api/2,https://example.com/api/3,];foreach($urlsas$url) {$request$client-request(GET,$url);$request-on(response,function(Response$response) {$response-on(data,function($chunk) {echo$chunk;});});$request-end();}$loop-run();优点基于事件驱动适合异步编程。支持长连接和流式处理。缺点需要安装 ReactPHP 库。代码复杂度较高。5. 使用多进程pcntl 扩展PHP 的 pcntl 扩展支持多进程编程可以通过创建子进程来实现并行处理。

更多文章