2011-05-03 59 views
2

我试图通过一个cronjob运行PHP脚本,有时(大约一半时间)我得到以下警告期间有时会失败):无法打开流:HTTP请求失败!在/path/myfile.php在线285PHP的file_get_contents的cronjob

该程序继续运行后,这让我觉得这不是一个超时问题或内存问题(超时设置为10分钟,内存为128M),但我存储该函数调用结果的变量是空的。奇怪的部分是,我正在与其他网址参数进行其他几个电话到这个网站,他们从来没有问题。这个函数调用的唯一区别是它下载的文件大约是70 MB,而其他文件大约是300 KB。

另外,我从来没有得到这个警告,如果我SSH进入Web服务器并手动运行PHP脚本,只有当它从一个CRON运行。

我也尝试使用cURL而不是file_get_contents,但后来内存不足。

谢谢,在这里的任何帮助将不胜感激。

回答

2

也许URL.com上的远程服务器有时超时或返回该特定(大)请求的错误?

我不认为你应该试图在一个变量中存储70mb。

您可以将cURL配置为直接下载到文件。类似于:

$file = fopen ('my.file', 'w'); 
$c = curl_init('http://url.com/whatever'); 
curl_setopt($c, CURLOPT_FILE, $file); 
curl_exec($c); 
curl_close($c); 
fclose($file); 

如果没有其他问题,curl应该会为您提供更好的错误信息。

+0

我给cURL另一个尝试,看看我得到什么样的输出。我知道我可能不应该保持70 MB的记忆,但它在测试过程中工作,所以我刚刚去了。写入文件的问题是我没有权限通过ssh编辑文件,但我想象着cronjob的所有者,我会试一试。 – Casey 2011-05-03 17:09:33

+1

@Casey - 据推测tmp目录是可写的。查看http://www.php.net/manual/en/function.tmpfile.php上的第4条评论(注意:他们正在讨论通过curl上传文件,但它基本相同) – Eli 2011-05-03 17:25:13

+0

对,temp是可写的。我现在将文件保存到php:// temp并从那里解析它。我会尝试运行cron,看看会发生什么。谢谢。 – Casey 2011-05-03 17:52:58

1

从另一个答案..仔细检查,这个问题是不是与您使用的URL参数发生了一些时间:

注意:如果你打开一个URI有特殊字符,如空格,您需要用urlencode()编码URI - http://docs.php.net/file%5Fget%5Fcontents

+0

URL参数是硬编码的,每次都是一样的,没有特殊字符。我不认为问题是与远程服务器或URL调用,否则它不会每次通过ssh工作。 – Casey 2011-05-03 17:12:07

+0

我有一种直觉,认为它与cron内存限制有关 - 尤其是当你在共享服务器上时,否则没有真正的理由认为它通过SSH工作不应该起作用。 你可以考虑用wget调用将它的一部分重写为shell脚本吗? – stevecomrie 2011-05-03 17:16:33

+0

会将它写成shell脚本绕过cron内存限制吗?我认为,由于cron而执行的所有内容都会受到相同的限制。 – Casey 2011-05-03 17:59:05