时光绘梦集
位置:首页PHP正文

道法自然 2025/03/03 周1

curl批处理

在 PHP 中,cURL 是一个强大的工具,用于与远程服务器进行 HTTP 请求。

#### 批处理 cURL 的优势

1. **提高性能**

批处理 cURL 允许多个请求同时进行,避免了顺序请求的等待时间,特别适合需要与多个 API 或服务交互的场景。

2. **节省资源**

通过批处理模式,PHP 可以在等待响应时释放 CPU 资源,避免空转,从而更高效地利用系统资源。

3. **简化复杂逻辑**

批处理模式使得并发请求的管理更加简单,避免了复杂的回调或异步处理机制。

---

#### 批处理 cURL 的基本用法

以下是一个简单的示例,展示如何使用 `curl_multi_*` 函数实现批处理并发请求:

<?php
// 初始化 cURL 多句柄
$mh = curl_multi_init();

// 创建多个 cURL 句柄
$handles = [];
$urls = [
    'https://api.example.com/data1',
    'https://api.example.com/data2',
    'https://api.example.com/data3'
];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

// 执行并发请求
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh); // 等待活动,避免 CPU 空转
} while ($running > 0);

// 获取响应并清理
$responses = [];
foreach ($handles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);

// 输出结果
print_r($responses);
?>

---

#### 关键点解析

1. **`curl_multi_init`**

初始化一个 cURL 多句柄,用于管理多个并发请求。

2. **`curl_multi_add_handle`**

将单个 cURL 句柄添加到多句柄中,使其参与并发执行。

3. **`curl_multi_exec`**

执行所有添加到多句柄中的请求。通过 `$running` 参数判断是否还有请求在进行中。

4. **`curl_multi_select`**

让脚本等待,直到至少一个请求有活动(如数据到达),避免 CPU 空转。

5. **`curl_multi_getcontent`**

获取单个请求的响应内容。

6. **`curl_multi_remove_handle`**

从多句柄中移除已完成的请求句柄。

7. **`curl_multi_close`**

关闭多句柄,释放资源。

---

#### 适用场景

- **API 聚合**:从多个 API 获取数据并合并结果。

- **批量处理**:同时向多个服务器发送请求,如批量上传或下载。

- **实时监控**:定期检查多个服务的状态。

通过 PHP 的 `curl_multi_*` 函数,我们可以轻松实现批处理的并发请求,显著提升脚本的性能和效率。无论是处理大量请求还是优化用户体验,批处理 cURL 都是一个强大的工具。

备注:curl_multi_select($mh)` 在等待期间会将进程挂起,进入空闲状态,CPU 和内存占用极低,进程不会占用资源,直到有事件触发(如网络响应到达)。这种方式是高效的,不会浪费系统资源。

curl_exec($ch)` 在等待数据返回期间会阻塞当前进程,进程会一直占用 CPU 等待响应,直到请求完成或超时。这种方式会持续占用系统资源,效率较低。


上一篇:php缓存
下一篇:养生