在cronjob期间,php文件获取内容有时会失败

在cronjob期间,php文件获取内容有时会失败,php,cron,webserver,file-get-contents,Php,Cron,Webserver,File Get Contents,我试图通过cronjob运行php脚本,有时(大约一半的时间)会收到以下警告: PHP警告:文件\u获取\u内容(http://url.com):无法打开流:HTTP请求失败!在第285行的/path/myfile.php中 程序在这之后继续运行,这使我认为这不是超时问题或内存问题(超时设置为10分钟,内存设置为128M),但我存储该函数调用结果的变量为空。奇怪的是,我用其他url参数对同一个网站进行了几个其他调用,但它们从来没有出现过问题。此函数调用的唯一区别是,它正在下载的文件约为70MB,

我试图通过cronjob运行php脚本,有时(大约一半的时间)会收到以下警告:

PHP警告:文件\u获取\u内容(http://url.com):无法打开流:HTTP请求失败!在第285行的/path/myfile.php中

程序在这之后继续运行,这使我认为这不是超时问题或内存问题(超时设置为10分钟,内存设置为128M),但我存储该函数调用结果的变量为空。奇怪的是,我用其他url参数对同一个网站进行了几个其他调用,但它们从来没有出现过问题。此函数调用的唯一区别是,它正在下载的文件约为70MB,而其他文件约为300KB

此外,如果我使用SSH连接到web服务器并手动运行php脚本,则永远不会收到此警告,只有在从cron运行php脚本时才会收到此警告

我也尝试过使用cURL而不是file_get_内容,但是我的内存不足


谢谢,如果您有任何帮助,我们将不胜感激。

也许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应该可以为您提供更好的错误信息。

来自另一个答案。。仔细检查您正在使用的URL参数是否在某些时候没有出现此问题:

注意:如果要使用特殊字符(如空格)打开URI,则需要使用urlencode()对URI进行编码


我再试试cURL,看看我得到了什么样的输出。我知道我可能不应该在内存中保留70MB,但它在测试期间工作正常,所以我就这么做了。写入文件的问题是,我没有通过ssh编辑文件的权限,但我认为cronjob的所有者有权限,我会尝试一下。@Casey-可能tmp目录是可写的。查看上的第四条评论(注意:他们说的是通过curl上传文件,但基本思想是一样的)你是对的,temp是可写的。我现在将文件保存到php://temp 然后从那里解析它。我将尝试运行cron,看看会发生什么。谢谢。使用cURL并写入临时目录就可以了。感谢URL参数是硬编码的,因此每次都是相同的,并且没有特殊字符。我不认为问题出在远程服务器或url调用上,否则它不会每次都通过ssh工作。我有一种直觉,它可能与cron内存限制有关——特别是如果您在共享服务器上,否则如果它通过ssh工作,就没有真正的理由不工作。你能考虑把它的一部分改写成shell脚本,并用WGET调用吗?会把它写成shell脚本来绕过克伦内存限制吗?我认为,由于cron而执行的所有操作都会受到相同的限制。我敢打赌wget更适合于拉取大文件的任务,我相信它在下载文件时会部分存储它们,而不是在内存中存储一个变量。