CronTab: не запускаются мои сценарии PHP?
окончательное редактирование: я переместил это в 406 Ошибка с GET Cron Job?
РЕДАКТИРОВАТЬ 4:
я получаю страницу с ошибкой 406 с этим cron!
вот crontab (скопированный с cPanel):
* * * * * GET https://abc.com/cron/sendBulletinEmails.php >>
/home/abc/public_html/cron/logs/sendBulletinEmails.log
вот журнал:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /cron/sendSurveyEmails.php could not be found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>
У меня есть php на виртуальной машине под управлением Linux. я установил свой crontab на:
* * * * * { cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails
однако, кажется, что cron не работает. он не регистрирует никаких ошибок и не отправляет электронные письма. ты знаешь что не так?
Спасибо!
РЕДАКТИРОВАТЬ 3:
Я нашел журналы cron работает. кажется, что все в порядке, но все равно ничего не работает и не выводит!
Aug 5 16:20:01 fiqsrv1 CRON[18543]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:21:01 fiqsrv1 CRON[18549]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:22:01 fiqsrv1 CRON[18554]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:23:01 fiqsrv1 CRON[18559]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:24:01 fiqsrv1 CRON[18564]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:25:01 fiqsrv1 CRON[18569]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:26:01 fiqsrv1 CRON[18574]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:27:01 fiqsrv1 CRON[18595]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:28:01 fiqsrv1 CRON[18601]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug 5 16:29:01 fiqsrv1 CRON[18610]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
РЕДАКТИРОВАТЬ 2:
теперь, когда я запускаю скрипт, он ничего не выводит.
я думал, что выложу скрипт, чтобы показать, что он ВСЕГДА выводит что-то, поэтому я запутался, когда запускаю его, и ничего не выходит (без ошибок, без вывода)
<?php
require '../includes/common.php';
/*
* check that this cron job isn't already running (it can take a long time if there is a large email load, which it is meant for)
* if it is running, end the script
* if it is not running, continue
* set the global variable for this cron job to on
* get all queued emails that have their time to be sent in the past (and so they should be mailed out now)
* loop through them, checking to see if the user is still set to receive the email, and if so, sending it to them
* set the global variable for this cron job to off
*
* JUST IN CASE: put the script in a try catch after the email cron is set to running in globalvars so that it is always reset, even upon failure
*/
// check that this cron job isn't already running (it can take a long time if there is a large email load, which it is meant for)
if(GlobalVars::isEmailCronRunning()) {
echo "Already running! Aborted.";
exit; // if it is running, end the script
}
// if it is not running, continue
// set the global variable for this cron job to on
GlobalVars::set(GlobalVars::VAR_IS_EMAIL_CRON_RUNNING, 1);
try {
// get all queued emails that have their time to be sent in the past (and so they should be mailed out now)
$queuedEmails = Emails::getAllQueuedToSend();
// loop through them, checking to see if the user is still set to receive the email, and if so, sending it to them
$numEmailsSent = 0;
$numEmailsRecalled = 0;
foreach($queuedEmails as $email) {
if(Emails::shouldBeSentToUser($email)) {
Emails::sendQueuedEmail($email[Emails::id]);
$numEmailsSent++;
} else {
Emails::update($email[Emails::id], array(Emails::result => Emails::RESULT_NOT_SENT) );
$numEmailsRecalled++;
}
}
// set the global variable for this cron job to off
GlobalVars::set(GlobalVars::VAR_IS_EMAIL_CRON_RUNNING, 0);
} catch (Exception $e) {
// set the global variable for this cron job to off
GlobalVars::set(GlobalVars::VAR_IS_EMAIL_CRON_RUNNING, 0);
echo "Error: " . print_r($e);
}
if($numEmailsSent || $numEmailsRecalled) {
$details = "Sent " . $numEmailsSent . ". Recalled " . $numEmailsRecalled . ".";
echo nl2br($details);
ActionLogs::add(ActionLogs::CAT_CRON_JOBS, ActionLogs::TYPE_CRON_EMAILER_RUN, $details);
} else {
echo "No emails were sent.";
}
?>
РЕДАКТИРОВАТЬ: я попытался запустить его и получил следующее:
Warning: require_once(/includes/Swift-4.0.6/lib/swift_required.php): failed to open stream: No such file or directory in /var/www/includes/common.php on line 31
Fatal error: require_once(): Failed opening required '/includes/Swift-4.0.6/lib/swift_required.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/includes/common.php on line 31
Как я могу установить путь включения, чтобы он работал как на моем сервере отладки Linux, так и на моем живом сервере Linux?
9 ответов
Вы можете использовать веб-версию в cron, если на сервере установлен GET(lwp-request) или curl
ПОЛУЧИТЬ
* * * * * GET http://localhost/cron/sendQueuedEmails.php > /dev/null
локон
* * * * * curl -o /dev/null http://localhost/cron/sendQueuedEmails.php
Прислушайтесь к моему совету кузнечика! Был здесь, сделал это. Сделайте это простым способом и используйте версию php "/usr/bin/php-cgi" для cgi. Если у вас его нет, установите его "apt-get install php5-cgi"
Не веришь мне? Попробуй это.
В вашем каталоге создайте текстовый файл с именем test.txt и добавьте случайный текст внутрь. Теперь создайте новый каталог с именем test и файл внутри него с именем test.php, затем добавьте этот код:
<?php
include '../test.txt';
?>
Ваша структура каталогов должна выглядеть примерно так:
/yourdirectory
/yourdirectory/test.txt
/yourdirectory/test/test.php
Перейдите в корневой каталог "cd /" и запустите его из командной строки:
/ usr / bin / php -f /yourdirectory/test/test.php
а потом
/usr/bin/php-cgi -f /yourdirectory/test/test.php
Увидеть разницу?
Добавьте папку, содержащую папку "includes", в ваш путь включения. Чтобы найти это используйте locate swift_required.php
Проверьте /var/log/cron и посмотрите, запущен ли он на самом деле. Если это так, попробуйте sudo -u, чтобы увидеть, дает ли он ошибки.
Исходя из вашего исходного вопроса и кода, который вы разместили, вам не хватает строки shebang, которая вам понадобится для запуска PHP-сценария таким образом. Попробуйте изменить первые несколько строк на это:
#!/usr/local/bin/php5 -q
<?php
// your script here
?>
И вы должны иметь успех.
Конечно, замените /usr/local/bin на правильный путь к вашей установке PHP. Это может / не может быть тем же самым. Эта начальная строка нужна вам только для запуска задания cron, а не для запуска из браузера.
Прямо сейчас эти сценарии могут отправлять свои выходные данные в битовую корзину, и вы не будете знать, почему они терпят неудачу. Возможно, ваши cronjobs не настроены на отправку электронной почты, или электронная почта в системе может не работать.
Я не фанат электронной рассылки вывода cron, отчасти потому, что люди всегда думают, что можно спамить вывод в "root", и я тот, кто получает это письмо. Поскольку в большинстве случаев речь идет о 1-2 строках вывода, я предлагаю вам записать вывод ваших cronjobs в syslog.
* * * * * { cd /var/www/cron && php -f sendBulletinEmails.php ;} |/usr/bin/logger -t sendBulletinEmails
* * * * * { cd /var/www/cron && php -f sendSurveyEmails.php ;} |/usr/bin/logger -t sendSurveyEmails
Более простой способ проверить, работает ли строка с cron
:
env -i bash -i /dev/null <actual command>
Эй... как дела, Эссина? Вот два решения вашей проблемы.
- Используйте полные пути для включаемых файлов в ваших скриптах. Нужно сделать это для всех включает. Если у включаемого файла есть другие включения, вам также необходимо обновить их.
include '../somefile.php' должен включать include '/somedir/somefile.php'
- Если #1 не работает или вы не хотите использовать полные пути для включений, попробуйте использовать php-cgi вместо php cli версии.
Также прочитайте этот раздел руководства php, обращая пристальное внимание на различия между cli и cgi.
http://www.php.net/manual/en/features.commandline.differences.php
CLI SAPI не меняет текущий каталог на каталог исполняемого скрипта!
Kick @ss!
Также - я бы попытался использовать полный путь к исполняемому файлу php. Обычно это / usr / bin / php, но вы можете указать, какой php перепроверить это для вашей системы.
Ваши записи будут выглядеть примерно так:
- cd / var / www / cron; /usr/bin/php -f sendBulletinEmails.php
- cd / var / www / cron; /usr/bin/php -f sendSurveyEmails.php
Кроме того, если вы изменяете каталог только так, чтобы файлы находились в текущем каталоге, вы всегда можете изменить cron:
- /usr/bin/php -f /var/www/cron/sendBulletinEmails.php
- /usr/bin/php -f /var/www/cron/sendSurveyEmails.php
Надеюсь это поможет.