我正在尝试从api下载所有数据,所以我正在卷入它并将结果保存为json文件。但是执行停止并且结果被截断并且永远不会结束。
如何解决这个问题。也许api服务器中的最长执行时间不能这么长,所以它会停止。我认为有超过10000个结果。
有没有办法下载前1000个,第2个1000个结果等等。顺便说一句,api使用sails.js作为他们的api,
这是我的代码:
<?php
$url = 'http://api.example.com/model';
$data = array (
'app_id' => '234567890976',
'limit' => 100000
);
$fields_string = '';
foreach($data as $key=>$value) { $fields_string .= $key.'='.urlencode($value).'&'; }
$fields_string = rtrim($fields_string,'&');
$url = $url.'?'.$fields_string;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, '300000000');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$response = curl_exec($ch);
print($response);
$file = fopen("results.json", 'w+'); // Create a new file, or overwrite the existing one.
fwrite($file, $response);
fclose($file);
curl_close($ch);
答案 0 :(得分:1)
许多可能的问题可能是原因。如果没有更多细节可以帮助理解客户端或服务器上是否存在问题,例如错误代码或其他信息,则很难说。
鉴于您使用URL调用API,将URL放入浏览器时会发生什么?如果您在浏览器中获得了良好的响应,那么问题可能就在于您的本地配置而不是节点/风帆。
以下是一些想法,看看问题是否是本地的,但我承认我不能说任何一个是正确的答案,因为我没有足够的信息做得更好:
php.ini
设置,如果您使用的是Apache,请httpd.conf
timeout设置。在浏览器中使用URL进行测试是一种查看这些设置是否有帮助的方法。如果浏览器下载响应正常,请开始检查这些设置,以防系统过早结束。CURLOPT_RETURNTRANSFER
,而是使用CURLOPT_FILE
。如果您不需要内存中的数据,这可以更快地节省内存并且(根据我的经验)更快。有关如何执行此操作的信息,请参阅此网站上的this article或this article。 foreach
构建URL的方式,我不得不怀疑您是否在查询字符串中编写了一个包含多达10,000个项目的巨大URL。如果是这样,这是一个糟糕的方法。在这种情况下,您可以考虑将请求分解为单个查询,然后使用curl_multi
或使用curl_multi
的{{3}}库来完成排队和执行多个请求的工作。 (如果您只是提出一个请求并获得一个巨大的细节响应,那么将不会有用。)