PHP使用hhvm卷曲最大执行时间

时间:2013-11-07 14:20:31

标签: php api curl sails.js

我正在尝试从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);

1 个答案:

答案 0 :(得分:1)

许多可能的问题可能是原因。如果没有更多细节可以帮助理解客户端或服务器上是否存在问题,例如错误代码或其他信息,则很难说。

鉴于您使用URL调用API,将URL放入浏览器时会发生什么?如果您在浏览器中获得了良好的响应,那么问题可能就在于您的本地配置而不是节点/风帆。

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

  1. 检查memory_limitmax_execution_timephp.ini设置,如果您使用的是Apache,请httpd.conf timeout设置。在浏览器中使用URL进行测试是一种查看这些设置是否有帮助的方法。如果浏览器下载响应正常,请开始检查这些设置,以防系统过早结束。
  2. 如果您要将响应保存到磁盘而不是操纵数据,则可以尝试删除CURLOPT_RETURNTRANSFER,而是使用CURLOPT_FILE。如果您不需要内存中的数据,这可以更快地节省内存并且(根据我的经验)更快。有关如何执行此操作的信息,请参阅此网站上的this articlethis article
  3. 如果脚本没有崩溃,请检查curl_errno中的内容。
  4. 相关:您的error reporting级别是多少?如果错误报告已关闭...为什么在调试时没有打开它?如果错误报告已开启......您是否收到任何错误?
  5. 鉴于您使用foreach构建URL的方式,我不得不怀疑您是否在查询字符串中编写了一个包含多达10,000个项目的巨大URL。如果是这样,这是一个糟糕的方法。在这种情况下,您可以考虑将请求分解为单个查询,然后使用curl_multi或使用curl_multi的{​​{3}}库来完成排队和执行多个请求的工作。 (如果您只是提出一个请求并获得一个巨大的细节响应,那么将不会有用。)
  6. 祝你好运。