php /var/www/html/*.php не работает в терминале, который открыт из меню. php *.php работает в терминале, который открыт внутри папки php, содержащей

Я хочу запустить PHP-скрипт из cron. Я устанавливаю cron с помощью:

*/1 * * * * php  /var/www/html/cron/cron_job.php

И я вижу это в crontab -u root -l, но задание не выполнено. Это также не работает, когда я запускаю команду непосредственно из командной строки следующим образом:

<?php  /var/www/html/cron/cron_job.php

Я перепробовал много ответов, связанных с cron, но ничего не получалось. Например:

/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);  

С правами доступа к файлам все в порядке, и он работает при запуске в браузере или при открытии терминала в /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) из терминала меню, то журнал ошибок получает сообщение об ошибке.

2 ответа

Решение

Ваш скрипт почти наверняка работает и создает ваш файл. Это просто не создает его там, где вы ожидаете. Вы не используете какой-либо путь в вашем скрипте, вы просто используете имя файла. Это означает, что файл будет создан в каталоге, в котором выполняется скрипт.

Вот почему, когда вы переходите в определенный каталог и запускаете там скрипт, вы думаете, что он работает. Поскольку файл создан в каталоге, в котором вы его запустили, вы можете его увидеть. По умолчанию, cron работает в домашнем каталоге пользователя, запустившего его. Так как это crontab root (что, кстати, плохая идея), файл будет создан в /root, Итак, проверь:

sudo ls /root/test.txt

Поэтому в следующий раз дайте вашему сценарию полный путь, а не просто имя файла:

<?php file_put_contents  ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>

Теперь файл будет создан в /path/to,

По умолчанию задания Cron выполняются в домашнем каталоге пользователя. Пока в вашем скрипте не указан путь, по которому будет сохранен выходной файл, он будет сохранен в каталоге, где выполняется скрипт.

В вашем PHP скрипте путь к файлу test.txt пропал, отсутствует. Вы можете установить его как абсолютное значение, как описано в ответе @ terdon, или указать относительный путь (с правильным происхождением). Например, если test.txt должен находиться в том же каталоге, что и cron_job.php содержимое вашего скрипта должно выглядеть примерно так:

<?php 
    $path = realpath(dirname(__FILE__)); 
    file_put_contents  ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>

В качестве альтернативы, если вы не хотите менять скрипт, вы можете изменить задание Cron следующим образом:

*/1 * * * * cd /var/www/html/cron/ && php cron_job.php
Другие вопросы по тегам