У меня есть сценарий cronStats.php, который извлекает данные из инструмента автоматического поиска Apple (данные о загрузках приложений, регионе и т. Д.) И заполняет базу данных для последующего доступа.
Когда скрипт выполняется в браузере, все работает правильно. Но при использовании запланированного задания 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 (который затем открывается и анализируется, а не показывается здесь).
Когда браузер выполняется, я получаю оператор «Contents Found», но через Cron Job оператор «No Contents» означает, что CURL_EXEC по какой-то причине дает сбой.
Я думаю, что файл .GZ не может быть создан, потому что задание Cron выполняется из другого каталога (?). Я попытался установить абсолютный URL для записи .txt.gz, но это также не удалось:
[function.fopen]: failed to open stream: HTTP wrapper does not support writeable connections in
Я в растерянности относительно того, как продолжить. Есть идеи?
РЕДАКТИРОВАТЬ:
спасибо за ваш отзыв, это ценится.
Основано на команде cron BojanT:
/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
РЕДАКТИРОВАТЬ 2 — Работа вокруг:
метод обхода, который работает для любого в подобной ситуации. Это не элегантно / эффективно, и на самом деле не решает проблему, но для чего стоит: настройте работу cron в другом файле: например, runCron.php:
<?php
executeScript();
function executeScript() {
file_get_contents("http://website.com/path/to/php/cron/cronStats.php");
informOfExecution();
}
который тогда выполняет фактический файл в абсолютном URL. Метод informOfExecution () отправляет мне электронное письмо с уведомлением об обновлении. было бы хорошо, если бы cron работал с файлом напрямую, но сделать это лучше, чем идеально. Спасибо всем.
Перейдите в каталог вашего файла с помощью «cd», а затем запустите ваш файл.
Пример:
* * * * * cd /f1/f2/f3/f4/ && php thing.php >> /home/output/outputs.txt
Других решений пока нет …