0

我正在尝试从 api 下载所有数据,所以我正在卷曲其中并将结果保存为 json 文件。但是执行停止并且结果被截断并且永远不会完成。

这怎么能补救。也许 api 的服务器中的最大执行时间不能服务这么久,所以它停止了。我认为有超过 10000 个结果。

有没有办法下载前 1000 个、第二个 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);
4

1 回答 1

1

许多可能的问题可能是原因。如果没有更多有助于了解问题出在客户端还是服务器上的详细信息,例如错误代码或其他信息,很难说。

假设您使用 URL 调用 API,当您将 URL 放入浏览器时会发生什么?如果您在浏览器中得到良好的响应,那么问题可能出在您的本地配置上,而不是节点/帆。

这里有一些想法,看看问题是否是本地的,但我承认我不能说任何一个都是正确的答案,因为我没有足够的信息来做得更好:

  1. 检查memory_limitmax_execution_timephp.ini的设置,如果您使用的是 Apache,请检查超时设置。在浏览器中使用 URL 进行测试是查看这些设置是否有帮助的一种方式。如果浏览器下载响应正常,请开始检查这些设置之类的内容,以了解您的系统过早结束的原因。httpd.conf
  2. 如果您将响应保存到磁盘而不是操作数据,您可以尝试删除CURLOPT_RETURNTRANSFER并改用CURLOPT_FILE. 如果您不需要内存中的数据,这可以提高内存效率并且(根据我的经验)更快。有关如何执行此操作的信息,请参阅此文章此站点上的此文章。
  3. 如果脚本没有崩溃,请检查curl_errno中的内容。
  4. 相关:您的错误报告级别是多少?如果错误报告已关闭...为什么在调试时没有打开它?如果错误报告处于打开状态...您是否收到任何错误?
  5. 鉴于您foreach用于构建 URL 的方式,我不得不怀疑您是否正在编写一个非常庞大的 URL,在您的查询字符串中包含多达 10,000 个项目。如果是这样,那是一个不好的方法。在这种情况下,您可以考虑将请求分解为单个查询,然后使用curl_multiRolling Curlcurl_multi来完成排队和执行多个请求的工作。(如果您只是发出一个请求并获得一个包含大量细节的巨大响应,那么这将没有用。)

祝你好运。

于 2013-11-10T23:50:18.157 回答