Я хочу выполнить Сценарий PHP от крона. Я устанавливаю крон с:
*/1 * * * * php /var/www/html/cron/cron_job.php
И я вижу его в crontab -u root -l
, но задание не выполняется. Это также не работает, когда я выполняю команду непосредственно из командной строки как это:
<?php /var/www/html/cron/cron_job.php
Я попробовал много ответов, связанных с кроном, но ничто не работало. Например:
/usr/local/bin /var/www/html/cron/cron_job.php
/usr/local/bin/php /var/www/html/cron/cron_job.php
sudo php -f /var/www/html/cron/cron_job.php
Сценарий PHP тестирования (cron_job.php
):
php file_put_contents ('test.txt',"test content\n",FILE_APPEND);
Полномочиями файла является весь OK, и он работает, когда выполнено в браузере или при открытии терминала в /var/www/html/cron/
и выполнение php cron_job.php
.
Согласно просьбе в комментариях, если я добавляю 2> /tmp/php.log
кому: php /var/www/html/cron/cron_job.php
используйте сценарий с синтаксической ошибкой и попыткой работать (php /var/www/html/cron/cron_job.php 2> /tmp/php.log
) от терминала меню затем журнал ошибок получает сообщение об ошибке.
Ваш сценарий почти наверняка выполняет и создает Ваш файл. Это просто не создает его, где Вы ожидаете, что это будет. Вы не используете пути в своем сценарии, Вы просто используете имя файла. Это означает, что файл будет создан в каталоге, в котором работает сценарий.
Вот почему, когда Вы перемещаетесь в определенный каталог и запускаете скрипт там, Вы думаете, что он работает. Поскольку файл создается в каталоге, Вы выполнили его в и таким образом, Вы видите его. По умолчанию, cron
выполнения в корневом каталоге пользователя, выполняющего его. Так как это - crontab корня (который, между прочим, плохая идея), файл будет создан в /root
. Так, пойдите проверка:
sudo ls /root/test.txt
Так, в следующий раз, дают Вашему сценарию полный путь вместо просто имени файла:
<?php file_put_contents ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>
Теперь, файл будет создан в /path/to
.
Кроном по умолчанию задания выполняются в корневом каталоге пользователя. В то время как в Вашем сценарии не обеспечивается путь, где выходной файл, который будет сохранен, он будет сохранен в каталог, где сценарий выполняется.
В Вашем документе на получение PHP путь к файлу test.txt
отсутствует. Можно установить его как абсолютное значение, как это описано в @terdon ответ , или можно обеспечить его как относительный путь (с надлежащим источником). Например, если test.txt
shuld быть расположенным в том же каталоге как cron_job.php
, содержание Вашего сценария должно стать чем-то как как это:
<?php
$path = realpath(dirname(__FILE__));
file_put_contents ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>
, С другой стороны, если Вы не хотите изменять сценарий, Вы могли бы сменить работу Крона таким образом:
*/1 * * * * cd /var/www/html/cron/ && php cron_job.php