我有一個名爲cronStats.php的腳本,用於從Apple的autoingest工具(應用程序下載,區域等數據)中提取數據並在稍後填充數據庫以供訪問。使用cron作業執行PHP腳本
當腳本在瀏覽器中執行時,一切正常。但是當使用計劃的cron作業來執行腳本時會出現錯誤。
下面是相關代碼:
function pullITCData($username,$password,$VND,$date) {
$fields_string = "USERNAME=" . urlencode($username);
$fields_string .= "&PASSWORD=" . urlencode($password);
$fields_string .= "&VNDNUMBER=" . $VND;
$fields_string .= "&TYPEOFREPORT=Sales";
$fields_string .= "&DATETYPE=Daily";
$fields_string .= "&REPORTTYPE=Summary";
$fields_string .= "&REPORTDATE=$date";
$fn = "dailyStat_" . $date . "_" . $VND;
$filename = $fn . ".gz";
//$abFN = __DIR__ . "/" . $fn;
//$abFilename = __DIR__ . "/" . $filename;
$abFN = $fn;
$abFilename = $filename;
$ch = curl_init();
echo("<br>abFN url is $abFN");
echo("<br>abFilename url is $abFilename");
$fp = fopen($abFilename, "w+");
//set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, 'https://reportingitc.apple.com/autoingestion.tft');
curl_setopt($ch, CURLOPT_POST, 7);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_FILE, $fp);
//execute post
$contents = curl_exec ($ch);
$fileCreated = false;
if ($contents === false) {
echo("<br> no contents");
} else {
echo("<br>contents found");
}
fclose($fp);
curl_close($ch);
//delete the opened file
if ($fileCreated == true){
unlink("$abFN");
}
}
我已經刪除了簡潔一些代碼。基本上,我將一串變量傳遞給Apple的攝取工具,然後返回一個.txt.gz文件(然後打開並解析,此處未顯示)。
當瀏覽器執行時,我得到「找到內容」語句,但是通過Cron Job,「無內容」語句表示CURL_EXEC由於某種原因失敗。
我的想法是無法創建.GZ文件,因爲Cron作業正從另一個目錄(?)執行。我嘗試設置一個絕對URL寫.txt.gz,不過這也失敗:
[function.fopen]: failed to open stream: HTTP wrapper does not support writeable connections in
我在一個不知如何着手。有任何想法嗎?編輯: 感謝您的反饋意見,非常感謝。 基於BojanT的cron命令:
/web/cgi-bin/php5 cd "$HOME/html/path/to/php/cron/ && php cronStats.php > cron.log 2>&1
,我發現了以下錯誤:
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
EDIT 2 - 補救措施: 變通方法是在類似情況下工作的人。它不是優雅/高效的,並沒有真正解決問題,而是它的價值:在另一個文件上設置一個cron作業:例如runCron.php:
<?php
executeScript();
function executeScript() {
file_get_contents("http://website.com/path/to/php/cron/cronStats.php");
informOfExecution();
}
然後它在絕對url處執行實際文件。 informOfExecution()方法向我發送電子郵件通知更新。 cron直接處理文件會很好,但是做得比完美更好。謝謝大家。
發佈您的crontab條目 – Dimitri 2014-09-29 20:39:30
其不捲曲它的fopen;用戶是否具有文件\目錄所需的權限 – 2014-09-29 20:42:27
您可以先關閉curl_close而不是關閉文件指針,如果沒有內容可以添加'echo curl_error($ ch);'。該錯誤消息表明您正在嘗試寫入HTTP Url,這很奇怪,您能否在觸發該錯誤的地方粘貼一行? – BojanT 2014-09-29 20:54:44