Я прочитал здесь, в Stackoverflow, что пути внутри файла могут быть проблемой, но, кажется, это не удается при первом чтении … Кроме этого, я не знаю, даже после проверки многих вопросов / ответов здесь. В какой-то момент я подумал, что это потому, что я использовал сокращенную версию тега PHP (« <? ?>
» Вместо « <?php ?>
»).
Поэтому в основном, когда я печатаю URL в браузере «http://site.com/file.php», он работает нормально (это резервная копия mysql + отправка по электронной почте). Но когда я пытаюсь запустить тот же файл с cron, я получаю ошибки …
Мой сервер находится на MediaTemple, cron:
php -c /home/xxxxxxx/domains/xxxxxxxxxxxxxx.com/html/777/fnc/filenamexxxxxx.php --'bckup=1'
Вот ошибка:
PHP: синтаксическая ошибка, неожиданный '(' in /nfs/c08/h02/mnt/xxxxxxx/domains/xxxxxxxxxxxxxxx.com/html/777/fnc/filenamexxxxxx.php в строке 2
Вот первая часть кода (как это, без редактирования, кроме адреса веб-сайта + электронной почты):
<?php // envoi un courriel de tous les rv des 7 prochains jours pour chaque clinique à toutes les 30min (cron script lancé par cpanel) session_start(); $bypass = 1; //$_SESSION['rep'] = "777/"; include_once("inc_includes_principaux.php"); //error_reporting(E_ERROR); // to send an automated backup by email, just link to this file like this with CRON: if ($_GET['bckup']){ // va chercher les infos de connection include_once('inc_bd_connexion.php'); // get cliniques $cliniques = _get_clinique_info();//_p($cliniques);_x(); $date = date('Ymd'); $date7jours = _get_x_days_before($date, 7, '+');//_e($date7jours);_x(); // iterate cliniques and send email foreach ($cliniques as $cliniqueid => $v) { $emailthis = _get_rv_printformat($date, $date7jours, $cliniqueid);// start, end, id // send email to users _email('emailaddressxxxxxxxx', $emailthis, 'LCJG - Horaire de '.$v['A29'].' du '._date_en_texte($date).' au '._date_en_texte($date7jours),'emailaddressxxxxxxxx'); sleep(1);//give a break to the server and let some other tasks execute _email('emailaddressxxxxxxxx', $emailthis, 'LCJG - Horaire de '.$v['A29'].' du '._date_en_texte($date).' au '._date_en_texte($date7jours),'emailaddressxxxxxxxx'); unset($emailthis); echo 'LCJG - Horaire de <b>'.$v['A29'].'</b> pour les 7 prochains jours envoyé par courriel.<br>'; } } ?>`
с<?php // envoi un courriel de tous les rv des 7 prochains jours pour chaque clinique à toutes les 30min (cron script lancé par cpanel) session_start(); $bypass = 1; //$_SESSION['rep'] = "777/"; include_once("inc_includes_principaux.php"); //error_reporting(E_ERROR); // to send an automated backup by email, just link to this file like this with CRON: if ($_GET['bckup']){ // va chercher les infos de connection include_once('inc_bd_connexion.php'); // get cliniques $cliniques = _get_clinique_info();//_p($cliniques);_x(); $date = date('Ymd'); $date7jours = _get_x_days_before($date, 7, '+');//_e($date7jours);_x(); // iterate cliniques and send email foreach ($cliniques as $cliniqueid => $v) { $emailthis = _get_rv_printformat($date, $date7jours, $cliniqueid);// start, end, id // send email to users _email('emailaddressxxxxxxxx', $emailthis, 'LCJG - Horaire de '.$v['A29'].' du '._date_en_texte($date).' au '._date_en_texte($date7jours),'emailaddressxxxxxxxx'); sleep(1);//give a break to the server and let some other tasks execute _email('emailaddressxxxxxxxx', $emailthis, 'LCJG - Horaire de '.$v['A29'].' du '._date_en_texte($date).' au '._date_en_texte($date7jours),'emailaddressxxxxxxxx'); unset($emailthis); echo 'LCJG - Horaire de <b>'.$v['A29'].'</b> pour les 7 prochains jours envoyé par courriel.<br>'; } } ?>`
вы не можете начать сеанс в среде cli
поэтому для запуска в обоих добавить
if (!isset($argc)) { //Not CLI session_start(); }
ИЛИ
if (PHP_SAPI === 'cli') { // is cli }
ваш $ _GET тоже не будет работать, значение будет в массиве $ argv. Вам нужно немного поработать над тем, как работает скрипт в CLI и через веб-сервер.
Чтобы избежать изменения моего кода, и поскольку я хотел легко реализовать решение, я последовал за предложением Dagon использовать wget, но вместо этого использовал CURL. Поэтому я мог бы сохранить свой код точно так, как он есть, и просто вызвать мой файл, чтобы выполнить его в определенное время.
Код, который работал без внесения изменений в мой скрипт:
curl www.aaaaaaa.com/file-to-execute.php?arg=1
И с этим, cron бежал отлично, и теперь все в порядке. Спасибо всем за вашу помощь!
Вместо -c
вы хотите использовать параметр -f
CLI?
$ php --help -c <path>|<file> Look for php.ini file in this directory -f <file> Parse and execute <file>.
Похоже, php может пытаться проанализировать ваш скрипт как файл INI, а затем ищет ваш скрипт из STDIN. (В противном случае я не уверен, почему php будет игнорировать -c
и продолжить выполнение вашего PHP-файла в качестве целевого скрипта.)