Использование Crontab для запуска php-скрипта

У меня есть PHP-скрипт, который просто отправляет мне тестовое сообщение по электронной почте. Если я зайду в cPanel своего веб-сервера, я смогу создать cronjob, который запускает скрипт каждые 10 минут, и он отлично работает.

Я вручную планирую задание cron в cPanel, используя следующие настройки:

10 * * * * php -q /home1/user1/public_html/mail.php

Опять же, вышеприведенное работает нормально, но когда я пытаюсь создать задание cron через PHP вместо cPanel, оно никогда не запускается. Когда я проверяю cPanel, чтобы увидеть, действительно ли задание было создано моим php-скриптом, оно ДЕЙСТВИТЕЛЬНО появляется. Все настройки, которые отображаются в cPanel, верны, просто скрипт не запускается.

Это код PHP, который я использую для создания задания cron:

$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.'10 * * * * php -q /home1/user1/public_html/mail.php'.PHP_EOL);
echo exec('crontab /tmp/crontab.txt');

Я предполагаю, что это может быть проблема с разрешением или что-то в этом роде? Не совсем уверен, почему задание работает, когда я его создаю, но не работает, когда его создает PHP.


person user1647347    schedule 29.05.2013    source источник
comment
Я бы сказал, что пользователю, под которым работает PHP, не разрешено создавать задачи cron вашим администратором сервера. Это было бы огромной дырой в безопасности в общей среде.   -  person crush    schedule 29.05.2013
comment
Может быть, но задание cron, которое создает PHP, действительно отображается в cPanel:/   -  person user1647347    schedule 29.05.2013
comment
Думаю, мне следует внимательнее прочитать вопрос в следующий раз, прежде чем комментировать.   -  person crush    schedule 29.05.2013
comment
Я бы не стал пытаться модифицировать crontab с помощью php. Как насчет вызова cron.php каждые 10 минут, а внутри cron.php вы можете делать свои собственные cron, определенные самодельным текстовым файлом или cron-менеджером на основе базы данных.   -  person steven    schedule 29.05.2013
comment
Я не слишком знаком с тем, что вы описали. У вас есть примеры?   -  person user1647347    schedule 29.05.2013
comment
Я думаю, он предлагает просто сделать одну задачу cron, которая затем читает из базы данных или текстового файла. Таким образом, вы можете запланировать задачу cron через cPanel. То, что вы делаете сейчас, должно сработать, хотя я думаю. Я не могу придумать никаких проблем с разрешениями, которые могли бы это предотвратить.   -  person crush    schedule 29.05.2013
comment
да, я мог бы сделать обходной путь, но я хотел бы выяснить, почему это не работает:/   -  person user1647347    schedule 29.05.2013


Ответы (2)


PHP-скрипты оболочки, например. cli/cron, ВСЕ ЕЩЕ требуется тег <?php. например

#!/usr/bin/php
<?php
$output = blah blah blah

Помните, что не существует такого понятия, как «php-скрипт». Есть только файлы, в которых есть блоки кода PHP. Без открывающего блока тегов <?php ГДЕ-НИБУДЬ в файле механизм выполнения PHP никогда не сработает, даже если файл будет обработан/проанализирован PHP.

Без <?php содержимое файла будет просто обрабатываться как открытый текст.

person Marc B    schedule 29.05.2013
comment
да, все мои файлы PHP имеют ‹?php и ?› - person user1647347; 29.05.2013
comment
снова задание запланировано и отображается в cPanel, оно просто не запускает mail.php - person user1647347; 29.05.2013
comment
@user1647347 user1647347 Вам не нужен закрывающий тег ?›, если только вы не собираетесь выводить что-то, что не должно отображаться как PHP, кстати. - person crush; 29.05.2013
comment
@user1647347 user1647347: закрытие ?> не требуется, если после завершения раздела кода не требуется выполнять некодовый вывод. - person Marc B; 29.05.2013

Закончилось тем, что я понял это ... Я уверен, что не так с php-кодом, который я использовал выше, но кажется, что это каким-то образом вызывало сбой выполнения.

Теперь я использую приведенный ниже код, расписание заданий и фактически запускаю :)

exec('echo -e "`crontab -l`\n10 * * * * php -q /home1/user1/public_html/mail.php" | crontab -');
person user1647347    schedule 29.05.2013