PHP не работает с CRON

1

Я использую 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
    Сценарий содержит только эту строку журнала? Или есть еще контекст, который вы нам не показываете? Потому что само по себе это должно работать. Так что это говорит мне о том, что скорее всего отсутствует контекст. Наиболее распространенной ошибкой является использование включает в себя с относительными путями.
  • 0
    Да, правильно знаю, что есть 4 строки: сообщения об ошибках и error_log. Создание файла также не работает (я пробовал fopen / fwrite, а также file_put_contents)
Показать ещё 7 комментариев
Теги:
cron

3 ответа

0
Лучший ответ

У меня были две проблемы:

1) Мой cron был выполнен с php.ini для php -c li. Я использовал флаг -c для загрузки хорошего.

2) Я полагался на $ _SERVER для объявления важных констант с использованием переменных, которых нет в cli-mode. Теперь, если эти переменные не установлены, я анализирую командные строки vars с помощью getopt()

0

Я столкнулся с той же проблемой, но смог исправить ее после прочтения ручного ввода для 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

и это работает!

0

Вы должны знать, что существуют специфические для пользователя 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню