PHP curl_pause 函数
最后修改日期:2025 年 4 月 11 日
PHP curl_pause 函数可以暂停和恢复 cURL 传输。它用于暂时停止正在进行的传输,然后稍后恢复它们。这对于控制带宽或实现自定义传输逻辑非常有用。
基本定义
curl_pause 函数暂停或恢复 cURL 传输。它接受一个 cURL 句柄和一个位掩码参数,指定要暂停的传输。该函数返回错误代码(成功时为 CURLE_OK)。
语法:curl_pause(CurlHandle $handle, int $bitmask): int。位掩码可以组合 CURLPAUSE_RECV、CURLPAUSE_SEND、CURLPAUSE_ALL 或 CURLPAUSE_CONT。始终检查返回值以处理错误。
基本暂停和恢复
本示例演示了如何暂停和恢复简单的下载。
<?php
declare(strict_types=1);
$ch = curl_init();
$fp = fopen("download.txt", "w");
curl_setopt($ch, CURLOPT_URL, "https://example.com/largefile");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function($resource, $download_size, $downloaded, $upload_size, $uploaded) {
if ($downloaded > 1024 * 1024) { // After 1MB
return CURLPAUSE_ALL; // Pause both directions
}
return CURLPAUSE_CONT; // Continue normally
});
curl_exec($ch);
// Later resume the transfer
curl_pause($ch, CURLPAUSE_CONT);
curl_close($ch);
fclose($fp);
此代码下载一个文件,但在 1MB 后暂停。进度函数返回 CURLPAUSE_ALL 进行暂停。之后,我们使用 CURLPAUSE_CONT 恢复。请注意,文件句柄在暂停期间保持打开状态。
仅暂停接收
本示例展示了如何仅暂停接收操作,同时允许发送。
<?php
declare(strict_types=1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/stream");
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) {
static $count = 0;
$count += strlen($data);
if ($count > 5000) {
return -1; // Triggers pause
}
echo $data;
return strlen($data);
});
curl_exec($ch);
// Check if paused
if (curl_errno($ch) == CURLE_READ_ERROR) {
// Pause only receiving
curl_pause($ch, CURLPAUSE_RECV);
// Later resume receiving
sleep(5);
curl_pause($ch, CURLPAUSE_CONT);
}
curl_close($ch);
我们使用 WRITEFUNCTION 来处理传入的数据。返回 -1 会暂停传输。然后我们使用 CURLPAUSE_RECV 显式地仅暂停接收。在暂停期间,如果配置正确,发送仍然可以正常工作。
在 Multi cURL 中暂停
本示例演示了在 multi cURL 传输中暂停特定句柄。
<?php
declare(strict_types=1);
$mh = curl_multi_init();
$ch1 = curl_init("https://api1.example.com/stream");
$ch2 = curl_init("https://api2.example.com/stream");
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
// Check if we should pause ch1
$info = curl_getinfo($ch1);
if ($info['size_download'] > 1024 * 512) { // 512KB
curl_pause($ch1, CURLPAUSE_ALL);
echo "Paused first transfer\n";
}
curl_multi_select($mh);
}
} while ($status == CURLM_OK && $active);
// Cleanup
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
在 multi 句柄上下文中,我们可以暂停单个传输。在这里,我们在 512KB 后暂停第一个传输,而第二个传输继续进行。Multi 接口在暂停期间会继续运行。
使用暂停进行速率限制
本示例使用 curl_pause 实现简单的速率限制。
<?php
declare(strict_types=1);
$ch = curl_init();
$start_time = microtime(true);
$bytes_received = 0;
$max_rate = 1024 * 50; // 50KB/s
curl_setopt($ch, CURLOPT_URL, "https://example.com/largefile");
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) use (&$bytes_received, $start_time, $max_rate) {
$bytes_received += strlen($data);
$elapsed = microtime(true) - $start_time;
$target_time = $bytes_received / $max_rate;
if ($elapsed < $target_time) {
$sleep = $target_time - $elapsed;
usleep((int) ($sleep * 1000000));
return CURLPAUSE_RECV; // Pause receiving
}
echo $data;
return strlen($data);
});
curl_exec($ch);
curl_close($ch);
我们计算所需的传输速率,并在进度超前时暂停接收。这创建了一个简单的速率限制器。WRITEFUNCTION 同时处理数据处理和速率控制。
上传期间暂停
本示例展示了如何在上传期间暂停。
<?php
declare(strict_types=1);
$ch = curl_init();
$data = str_repeat("test data ", 100000); // Large data
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/upload");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_READFUNCTION, function($ch, $fd, $length) {
static $sent = 0;
$chunk = substr($GLOBALS['data'], $sent, $length);
$sent += strlen($chunk);
if ($sent > 1024 * 100) { // After 100KB
return ''; // Triggers pause
}
return $chunk;
});
curl_exec($ch);
// Check if paused
if (curl_errno($ch) == CURLE_READ_ERROR) {
echo "Upload paused at 100KB\n";
sleep(2); // Wait 2 seconds
curl_pause($ch, CURLPAUSE_CONT); // Resume
curl_exec($ch); // Continue transfer
}
curl_close($ch);
在上传期间,READFUNCTION 可以通过返回空字符串来触发暂停。然后我们使用 curl_pause 显式恢复。请注意,恢复后我们需要再次调用 curl_exec。
最佳实践
- 错误处理: 始终检查 curl_pause 的返回值。
- Multi 句柄: 暂停功能在 multi 接口上下文中有效。
- 方向控制: 暂停特定的传输方向。
- 资源使用: 连接在暂停期间保持打开状态。
- 超时: 注意长时间暂停期间的超时。
来源
本教程通过实际示例介绍了 PHP curl_pause 函数,展示了其在控制传输方面的用法。