您好,我在下载远程文件时遇到了一个奇怪的问题。我正在使用Flurry Data API下载一些报告。事情是,当我们第一次调用Flurry API时,它为我们提供了XML / JSON响应,其中包含Report for Download的路径。报告需要2分钟才能准备好。我对那件事有疑问。我写了一个下载远程文件的脚本,如果我只是将Report的链接直接粘贴到已经准备好下载的功能上。它就像一个魅力,但我必须自动化下载过程。因此,我首先调用API并获取报告下载链接然后我使用PHP的sleep()
函数来停止执行3分钟(也用2尝试)。然后我调用相同的功能,我用来成功下载报告这次不起作用。这是文件下载方法:
function get_file_and_save($file, $local_path, $newfilename) {
$err_msg = '';
$out = fopen($local_path . $newfilename . ".gz", 'wb');
if ($out == FALSE) {
print "File is not available<br>";
exit;
}
$ch = curl_init();
$headers = array('Content-type: application/x-gzip', 'Connection: Close');
curl_setopt($ch, CURLOPT_FILE, $out);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $file);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_exec($ch);
echo "<br>Error Occured:" . curl_error($ch);
curl_close($ch);
}
我也试过给CURLOPT_TIMEOUT
,但它也没有用。
请求Flurry的代码注意download_path
工作正常,只是获取报告链接:
$query_url = 'http://api.flurry.com/rawData/Events?apiAccessCode=' . $ACCESS_CODE . '&apiKey=' . $API_KEY . '&startTime=' . $start_time . '&endTime=' . $end_time;
$response = download_path($query_url);
if ($response) {
$response_obj = json_decode($response, true);
if (isset($response_obj['report']['@reportUri'])) {
$report_link = $response_obj['report']['@reportUri'];
}
if (isset($response_obj['report']['@reportId'])) {
$report_id = $response_obj['report']['@reportId'];
}
if(isset($report_link) && !empty($report_link)){
echo "<br >Report Link: ".$report_link."<br >";
sleep(240);
$config = array(
'http' => array(
'header' => 'Accept: application/json',
'method' => 'GET'
)
);
$stream = stream_context_create($config);
$json= file_get_contents($report_link,false,$stream);
echo "<pre>";
print_r($http_response_header);
echo "</pre>";
if($http_response_header[3] == "Content-Type: application/octet-stream"){
get_file_and_save($report_link, "data-files/gz/", $current_time);
}
}
else{
echo "There was some error in downloading report";
}
} else {
$error = true;
echo "There was some error in genrating report";
}
sleep()
有什么问题,或者我被困在第二天晚上我无法实现它。
答案 0 :(得分:0)
检查您的PHP脚本是否超时并被终止。 Web服务器和PHP都有最大的执行限制,以防止失控的脚本,如果你的睡眠超过了这个限制,它将永远不会超过这个限制。
http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time
http://php-fpm.org/wiki/Configuration_File - request_terminate_timeout
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout
http://httpd.apache.org/docs/2.0/mod/core.html#timeout