PHP curl_multi_setopt 函数
最后修改日期:2025 年 4 月 11 日
PHP curl_multi_setopt
函数为 cURL Multi 句柄设置选项。它用于配置多个并发 cURL 传输的行为。此函数与 curl_multi_init() 创建的句柄一起使用。
基本定义
curl_multi_setopt
函数为给定的 cURL Multi 句柄设置一个选项。成功时返回 TRUE,失败时返回 FALSE。该函数接受三个参数。
语法:curl_multi_setopt(CurlMultiHandle $multi_handle, int $option, mixed $value): bool
。Multi 句柄必须使用 curl_multi_init()
创建。选项会影响 Multi 句柄如何处理多个传输。
设置 Pipeline 选项
此示例演示如何为多个请求启用 HTTP Pipelining。
<?php declare(strict_types=1); $mh = curl_multi_init(); // Enable HTTP pipelining curl_multi_setopt($mh, CURLMOPT_PIPELINING, CURLPIPE_HTTP1 | CURLPIPE_MULTIPLEX); $ch1 = curl_init("https://example.com/api1"); $ch2 = curl_init("https://example.com/api2"); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($mh, $ch1); curl_multi_add_handle($mh, $ch2); // Execute the multi handle $running = null; do { curl_multi_exec($mh, $running); } while ($running > 0); // Get responses $response1 = curl_multi_getcontent($ch1); $response2 = curl_multi_getcontent($ch2); // Clean up curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
此代码为多个请求启用 HTTP Pipelining。CURLMOPT_PIPELINING 允许通过同一连接发送请求。当向同一服务器发出多个请求时,这可以提高性能。
设置最大主机连接数
此示例展示如何限制到单个主机的连接数。
<?php declare(strict_types=1); $mh = curl_multi_init(); // Limit to 2 connections per host curl_multi_setopt($mh, CURLMOPT_MAX_HOST_CONNECTIONS, 2); $handles = []; $urls = [ "https://api.example.com/users/1", "https://api.example.com/users/2", "https://api.example.com/users/3", "https://api.example.com/users/4" ]; foreach ($urls as $url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($mh, $ch); $handles[] = $ch; } // Execute the multi handle $running = null; do { curl_multi_exec($mh, $running); curl_multi_select($mh); } while ($running > 0); // Process responses foreach ($handles as $ch) { echo curl_multi_getcontent($ch) . "\n"; curl_multi_remove_handle($mh, $ch); curl_close($ch); } curl_multi_close($mh);
我们使用 CURLMOPT_MAX_HOST_CONNECTIONS 将到同一主机的连接限制为 2。这可以防止因过多的并发连接而使服务器过载。当达到限制时,Multi 句柄将排队请求。
设置最大总连接数
此示例演示如何限制并发连接的总数。
<?php declare(strict_types=1); $mh = curl_multi_init(); // Limit to 3 total connections curl_multi_setopt($mh, CURLMOPT_MAXCONNECTS, 3); $handles = []; $urls = [ "https://api1.example.com", "https://api2.example.com", "https://api3.example.com", "https://api4.example.com", "https://api5.example.com" ]; foreach ($urls as $url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($mh, $ch); $handles[] = $ch; } // Execute the multi handle $running = null; do { curl_multi_exec($mh, $running); curl_multi_select($mh); } while ($running > 0); // Process responses foreach ($handles as $ch) { echo curl_multi_getcontent($ch) . "\n"; curl_multi_remove_handle($mh, $ch); curl_close($ch); } curl_multi_close($mh);
CURLMOPT_MAXCONNECTS 将所有并发连接限制为 3。这在向多个不同主机发出请求时很有用。当达到全局连接限制时,Multi 句柄将排队请求。
设置 Socket 回调
此示例展示如何使用 Socket 回调进行监控。
<?php declare(strict_types=1); function socket_callback($mh, $timeout_ms) { // Custom logic to handle socket activity echo "Socket callback called with timeout: $timeout_ms ms\n"; return 0; } $mh = curl_multi_init(); // Set socket callback function curl_multi_setopt($mh, CURLMOPT_SOCKETFUNCTION, 'socket_callback'); $ch1 = curl_init("https://example.com/api1"); $ch2 = curl_init("https://example.com/api2"); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($mh, $ch1); curl_multi_add_handle($mh, $ch2); // Execute the multi handle $running = null; do { curl_multi_exec($mh, $running); } while ($running > 0); // Get responses $response1 = curl_multi_getcontent($ch1); $response2 = curl_multi_getcontent($ch2); // Clean up curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
CURLMOPT_SOCKETFUNCTION 设置一个用于 Socket 活动监控的回调。该回调接收 Multi 句柄和超时值。这允许在 Socket 准备好读/写时执行自定义逻辑。
设置 Timer 回调
此示例演示如何使用 Timer 回调进行超时控制。
<?php declare(strict_types=1); function timer_callback($mh, $timeout_ms) { // Custom timeout handling logic echo "Timer callback called with timeout: $timeout_ms ms\n"; return 0; } $mh = curl_multi_init(); // Set timer callback function curl_multi_setopt($mh, CURLMOPT_TIMERFUNCTION, 'timer_callback'); $ch1 = curl_init("https://example.com/api1"); $ch2 = curl_init("https://example.com/api2"); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($mh, $ch1); curl_multi_add_handle($mh, $ch2); // Execute the multi handle $running = null; do { curl_multi_exec($mh, $running); } while ($running > 0); // Get responses $response1 = curl_multi_getcontent($ch1); $response2 = curl_multi_getcontent($ch2); // Clean up curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
CURLMOPT_TIMERFUNCTION 设置一个用于超时控制的回调。该回调接收 Multi 句柄和超时值(以毫秒为单位)。这允许实现自定义超时处理逻辑。
最佳实践
- 连接限制: 使用 CURLMOPT_MAX_HOST_CONNECTIONS 来礼貌地对待服务器。
- 性能: 在向同一主机发出多个请求时启用 Pipelining。
- 资源管理: 始终使用 curl_multi_remove_handle 清理句柄。
- 错误处理: 检查 curl_multi_setopt 调用的返回值。
- 监控: 使用回调对传输进行高级控制。
来源
本教程介绍了 PHP curl_multi_setopt
函数,并通过实际示例展示了其在配置多个 cURL 传输方面的用法。