Запуск PHP-скрипта с помощью crontab

Я понимаю, что SO – это вопрос, но независимо от того, сколько учебных пособий я искал, я не могу заставить свой crontab работать, и я создаю веб-сайт, который будет полагаться на crontab чтобы каждый раз crontab конкретную настройку в моей базе данных.

Вот мой файл crontab :

 # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 am every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # mh dom mon dow command * * * * * /usr/bin/php -q /var/www/html/cron/index.php 

Если я попытаюсь cd к /usr/bin/php я получу

 -bash: cd: /usr/bin/php: Not a directory 

Поэтому я cd 'd просто /usr/bin/ и это то, что я нашел:

 -rwxr-xr-x 1 root root 27216 Feb 10 15:08 pgrep* lrwxrwxrwx 1 root root 21 Jun 13 09:36 php -> /etc/alternatives/php* -rwxr-xr-x 1 root root 9049256 Jul 2 11:57 php5* 

Если я cd к /etc/alternatives я нахожу:

 lrwxrwxrwx 1 root root 13 Jun 13 09:36 php -> /usr/bin/php5* 

Я возвращаюсь к файлу bin , php5 имеет символ * и зеленый.

 -rwxr-xr-x 1 root root 9049256 Jul 2 11:57 php5* 

Мой скрипт PHP. Очень просто. Проверяет файл cookie, и если он существует, он увеличивает его на единицу. Затем я проверяю результаты на другой странице. Вручную это работает. С помощью crontab вы не можете заставить его работать.

 if (!empty($_COOKIE['cronTest'])) { $int = $_COOKIE['cronTest']; $int++; setcookie("cronTest", $int, time()+3600); } 

  • Скорее всего, ваш скрипт внутри /var/www/html/cron принадлежит пользователю www-data . В зависимости от вашей установки пользователь, выполняющий cronjob, не имеет разрешений для запуска этого файла.

  • В командной строке нет $ _COOKIE. Куки-файл отправляется браузером пользователей. Поскольку cli не является браузером, вы не можете прочитать значение cookie. Хотя вы можете получить доступ к пользователям $ _SESSION, но это еще одна история. Посмотрите здесь. Можно ли прочитать значение cookie / session при выполнении скрипта PHP5 через командную строку? для получения дополнительной информации.

Строка cronjob выглядит корректно, поэтому проблема будет одной из вышеперечисленных точек. Чтобы проверить первое, попробуйте что-то без использования $ _COOKIE в вашем файле, например, просто

 mkdir('/var/www/html/cron/testdir'); 

просто посмотреть, доступен ли файл, и создается ли каталог внутри указанного каталога. Если доступ к нему недоступен, создайте новую группу и добавьте как текущего пользователя (узнайте с помощью

 ls -al 

в / var / www / html / cron) и пользователь, выполняющий cronjob для группы, затем сделайте эту группу собственностью файла, который вы хотите запустить. См. Принятый ответ на этот вопрос: Установите разрешения для пользователей | Команда Artisan не будет работать в коде, но отлично работает в командной строке. Я отправил некоторое время назад о том, как это сделать.

Для проблемы $ _COOKIE вам нужно найти другое решение. Например, используйте Redis или Memcached в качестве службы кэширования, к которой можно получить доступ как в режиме онлайн, так и в настройках cli.

Попробуйте добавить

 1>> /dev/null 2>&1 

до конца строки cronjob, если вы этого не сделаете, и пусть cron запускает это каждую минуту, вы получите массу лог-файлов.

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