
本文介绍在 api 仅支持固定页大小(如每页 100 条)且不返回总记录数的情况下,使用 php curl 迭代请求所有分页数据并统计总数的可靠方法。
本文介绍在 api 仅支持固定页大小(如每页 100 条)且不返回总记录数的情况下,使用 php curl 迭代请求所有分页数据并统计总数的可靠方法。
当调用第三方分页 API(如 https://api.shop.com/v1/products?page_size=100&page_number=N)时,若其未提供 total_count、next_page_url 或 last_page 等元信息,无法预先得知总页数或总记录数。此时最健壮的策略是基于响应实际数据量进行终止判断:只要某次请求返回的记录数少于设定的 page_size,即可判定已到达末页。
以下为完整、可直接运行的 PHP 示例(含错误处理与请求封装):
<?php function fetchAllRecords($baseUrl, $pageSize = 100) {
$allRecords = [];
$totalFound = 0;
$pageNumber = 1;
do {
$url = sprintf('%s?page_size=%d&page_number=%d', $baseUrl, $pageSize, $pageNumber);
// 使用 cURL 发起请求(生产环境建议添加超时、重试、Header 认证等)
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new RuntimeException("API request failed with status {$httpCode} for URL: {$url}");
}
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException("Invalid JSON response from API");
}
// 假设 API 返回结构为 { "data": [...], "count": 100 } 或直接返回数组
$records = is_array($data) && isset($data['data']) ? $data['data'] : $data;
if (!is_array($records)) {
throw new RuntimeException("Unexpected API response format: expected array or 'data' key");
}
$recordsCount = count($records);
$allRecords = array_merge($allRecords, $records);
$totalFound += $recordsCount;
// 关键终止条件:返回条数 $totalFound,
'records' => $allRecords
];
}
// 使用示例
try {
$result = fetchAllRecords('https://api.shop.com/v1/products');
echo "共获取 {$result['total']} 条记录。\n";
// 处理 $result['records'] 数据(如入库、导出等)
} catch (Exception $e) {
error_log("获取数据失败: " . $e->getMessage());
}
关键注意事项:
✅ 不要依赖 page_number 范围猜测:API 不支持 page_number=1-100 类语法,该参数必须为整数。
✅ 以实际响应数据量为终止依据:这是无元数据 API 的通用最佳实践,比预估页数更准确、更安全。
⚠️ 务必添加错误处理:网络异常、HTTP 错误、JSON 解析失败等均需捕获,避免循环卡死或静默失败。
⚠️ 遵守 API 速率限制:加入 usleep() 或指数退避,并检查响应头(如 X-RateLimit-Remaining)。
? 内存优化建议:若数据量极大(如数十万条),可改为逐页处理+写入文件/数据库,而非全量存入内存。
该方案不依赖 API 提供的总数量字段,具备强兼容性与鲁棒性,适用于绝大多数 RESTful 分页接口。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











