2011-05-03 93 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