Я использую crontab для вызова php-скрипта.
В этом скрипте есть
error_log('test');
Когда сценарий выполняется из http или прямой командной строки, например
php -f script.php
Все в порядке, моя ошибка - журнал.
Но при вызове из cron он не работает.
Вот мой cron
* * * * * -u www-data /full_path_to/php -f /full_path_to/script.php
Вот что я пробовал:
error_log с аргументами:
error_log('test', 3, '/full_path_to/error.log');
изменение отчетов об ошибках:
error_reporting(E_ALL);
ini_set('display_errors','On');
ini_set('error_log', '/full_path_to/error.log');
cron call заканчивается на>/full_path_to/error.log 2> & 1 (не знаю, если это полезно)
Для http путь error_log установлен из htaccess. Я потерялся с php cli...
Я вижу, что выполнение cron работает каждую минуту (syslog), так что это должна быть проблема с конфигурацией PHP?
Большое спасибо, если вы можете помочь.
Изменение: Cron выполняется с помощью "-u www-data"
Вот вызов, который я вижу в syslog:
CRON[13921]: (www-data) CMD (-u www-data /usr/bin/php -f /fullpath/script.php > /fullpath/error.log 2>&1)
У меня были две проблемы:
1) Мой cron был выполнен с php.ini для php -c li. Я использовал флаг -c для загрузки хорошего.
2) Я полагался на $ _SERVER для объявления важных констант с использованием переменных, которых нет в cli-mode. Теперь, если эти переменные не установлены, я анализирую командные строки vars с помощью getopt()
Я столкнулся с той же проблемой, но смог исправить ее после прочтения ручного ввода для php.
Первоначально у меня было что-то вроде:
/usr/bin/php -f /path/to/php/script.php -c 1426 >> /tmp/script.php.log 2>&1
Я смог исправить это, изменив строку:
/usr/bin/php -f /path/to/php/script.php -- -c 1426 >> /tmp/script.php.log 2>&1
В соответствии с ручным вводом синтаксис:
php [options] [ -f ] file [[--] args...]
Также,
args... Arguments passed to script. Use '--' args when first argument starts with '-' or script is read from stdin
Поступая таким образом, моя команда cron становится:
/usr/bin/php -f /path/to/php/script.php -- -c 1426 >> /tmp/script.php.log 2>&1
и это работает!
Вы должны знать, что существуют специфические для пользователя crontab и системный crontab.
Когда вы crontab -e
в систему как пользователь foo
и введите crontab -e
в консоли, это позволит вам отредактировать собственный пользовательский crontab. Все заданные задачи cron будут выполняться как пользователь foo
. Это верно даже для пользователя root
. AFAIK таким образом вы просто не можете изменить пользователя, под которым будет выполняться задача cron.
Совсем другое - файл /etc/crontab
. Это системный кронаб. Внутри этого файла вы можете изменить пользователя задачи cron следующим образом:
* * * * * www-data /full_path_to/php -f /full_path_to/script.php