PHP调用分页API写入文件:数据未追加仅保留最后一页
问题分析与修复代码
核心问题
- 循环未更新分页状态:每次请求下一页后,没有将新响应解码为
$data,导致循环一直沿用初始页的hasMore状态和cursor,要么无限重复请求同一页,要么提前终止循环。 - 过早关闭CURL句柄:
curl_close($curl)写在循环内部,第一次循环结束就销毁了CURL资源,后续循环无法发起新请求。 - 初始写入逻辑存在覆盖风险:首次写入用默认覆盖模式,若后续循环异常,可能丢失初始页数据。
修正后的代码
<?php ini_set('max_execution_time','240'); $url = "https://myDomain/incoming/v2/content"; // 仅初始化一次CURL句柄 $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $headers = array( "Accept: application/json", "Authorization: Bearer myKey", ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 仅本地调试使用,生产环境请开启SSL验证 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 首次请求并写入文件(先清空文件再写入初始页) file_put_contents('CURL-MEETINGS-ILT-VILT_NEWEST.txt', ''); $response = curl_exec($curl); if ($response === false) { die("Error: " . curl_error($curl)); } file_put_contents('CURL-MEETINGS-ILT-VILT_NEWEST.txt', $response, FILE_APPEND); $data = json_decode($response, true); // 循环获取所有分页数据 while ($data['pageInfo']['hasMore'] === true) { $cursor = $data['pageInfo']['cursor']; // 更新请求URL为带cursor的地址 curl_setopt($curl, CURLOPT_URL, "https://myDomain/incoming/v2/content?cursor=$cursor"); $response1 = curl_exec($curl); if ($response1 === false) { die("Error: " . curl_error($curl)); } // 追加写入当前页数据 file_put_contents('CURL-MEETINGS-ILT-VILT_NEWEST.txt', $response1, FILE_APPEND); echo "File appended successfully\n"; // 关键:更新$data为当前页的响应数据,供下一次循环判断使用 $data = json_decode($response1, true); } // 所有请求完成后再关闭CURL句柄 curl_close($curl); ?>
额外说明
- 先执行
file_put_contents('xxx.txt', '')清空目标文件,避免残留旧数据。 - 每次循环必须更新
$data变量,确保下一次循环使用当前页的hasMore状态和最新cursor。 - CURL句柄仅在所有请求完成后关闭,避免重复初始化资源,提升执行效率。
内容的提问来源于stack exchange,提问作者Mark H-TR
相关产品推荐
相关产品推荐

