
本文详解如何用 PHP cURL 实现游标(cursor)分页的自动遍历,持续请求直到 hasMore 为 false,并将全部 JSON 响应追加写入本地文件,含完整可运行代码、错误处理建议与安全注意事项。
本文详解如何用 php curl 实现游标(cursor)分页的自动遍历,持续请求直到 `hasmore` 为 `false`,并将全部 json 响应追加写入本地文件,含完整可运行代码、错误处理建议与安全注意事项。
在调用支持游标分页(cursor-based pagination)的 RESTful API 时,仅获取第一页数据远远不够。典型响应结构中包含 "pageInfo": {"cursor": "Mg", "hasMore": true} 字段,需据此动态构造下一页请求 URL(如 ?cursor=Mg),并循环执行直至 hasMore 变为 false。以下是一份健壮、可直接使用的 PHP 教程实现:
✅ 完整可运行示例代码
<?php // 配置参数(请替换为实际值)
$base_url = 'https://api.example.com/incoming/v2/content';
$token = 'your_bearer_token_here';
$filename = 'CURL-CONTENT.txt';
// 初始化:清空文件(首次写入前确保干净)
file_put_contents($filename, '');
// 初始请求 URL(无 cursor 参数)
$url = $base_url;
do {
// 初始化 cURL
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Authorization: Bearer ' . $token,
],
// ⚠️ 生产环境务必移除!仅调试时禁用 SSL 验证
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
]);
$response = curl_exec($curl);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$error = curl_error($curl);
curl_close($curl);
// 基础错误处理
if ($response === false || $http_code !== 200) {
error_log("[cURL Error] HTTP {$http_code}: {$error}");
break;
}
// 解析 JSON 响应(确保是有效 JSON)
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('[JSON Error] Invalid response format');
break;
}
// 将当前页数据追加写入文件(换行分隔,便于后续解析)
file_put_contents($filename, $response . "\n", FILE_APPEND | LOCK_EX);
// 提取 pageInfo 中的分页控制字段
$page_info = $data['pageInfo'] ?? [];
$has_more = $page_info['hasMore'] ?? false;
$next_cursor = $page_info['cursor'] ?? null;
// 若仍有更多数据,更新 URL;否则退出循环
if ($has_more && $next_cursor) {
$url = $base_url . '?cursor=' . urlencode($next_cursor);
echo "→ Fetching next page with cursor: {$next_cursor}\n";
usleep(100000); // 可选:100ms 限流,避免触发 API 限速
} else {
echo "✅ All pages fetched. Total written to {$filename}.\n";
break;
}
} while (true);
?>
? 关键要点说明
-
游标安全编码:使用
urlencode($next_cursor)防止特殊字符(如/,+,=)破坏 URL 结构; -
原子写入保护:
FILE_APPEND | LOCK_EX确保多进程/并发场景下文件写入不被覆盖或损坏; -
生产环境必改项:
- 移除
CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER的false设置,改用系统 CA 证书包; - 添加重试机制(如网络超时后重试 2 次);
- 记录详细日志(时间戳、请求 URL、HTTP 状态码)便于排障;
- 移除
- 内存友好设计:未将全部响应缓存在内存中,而是逐页写入磁盘,适合海量数据导出。
? 总结
该方案以最小侵入方式扩展了原始代码,通过 do...while 循环 + 动态 URL 构造 + JSON 解析驱动分页逻辑,兼顾可读性与鲁棒性。只要 API 遵循标准游标分页规范(返回 pageInfo.cursor 与 pageInfo.hasMore),即可开箱即用。建议配合 set_time_limit(0)(如需长时间运行)及错误监控进一步加固生产部署。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










