Мы пытаемся настроить задание крона для сайта Magento.
Мы судили этого Job, но это не работало на нас:
*/5 * * * * php -f /var/www/html/sitename/cron.php
Для отладки мы судили этого Job:
*/5 * * * * /usr/bin/php -q /var/www/html/sitename/cron.php >
/var/www/html/sitename/cron-temp.log 2>&1
В результате мы нашли эти ошибки в cron-temp.log
:
PHP Warning: require(app/bootstrap.php): failed to open stream:
No such file or directory in /var/www/html/sitename/cron.php on line 30
PHP Fatal error: require(): Failed opening required 'app/bootstrap.php'
(include_path='.:/usr/share/php:/usr/share/pear') in /var/www/html/sitename
/cron.php on line 30
cron.php
<?php
// Change current directory to the directory of current script
chdir(dirname(__FILE__));
require 'app/bootstrap.php';
require 'app/Mage.php';
if (!Mage::isInstalled()) {
echo "Application is not installed yet, please complete install wizard first.";
exit;
}
// Only for urls
// Don't remove this
$_SERVER['SCRIPT_NAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_NAME']);
$_SERVER['SCRIPT_FILENAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_FILENAME']);
Mage::app('admin')->setUseSessionInUrl(false);
umask(0);
$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
$isShellDisabled = true;
try {
if (stripos(PHP_OS, 'win') === false) {
$options = getopt('m::');
if (isset($options['m'])) {
if ($options['m'] == 'always') {
$cronMode = 'always';
} elseif ($options['m'] == 'default') {
$cronMode = 'default';
} else {
Mage::throwException('Unrecognized cron mode was defined');
}
} else if (!$isShellDisabled) {
$fileName = basename(__FILE__);
$baseDir = dirname(__FILE__);
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
exit;
}
}
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}
PHP Fatal error: require(): Failed opening required 'app/bootstrap.php'
(include_path='.:/usr/share/php:/usr/share/pear')
Это похоже на Ваш required
наклон файлов быть найденным и таким образом, это бросает ошибку. Я предполагаю, что эти файлы находятся в /var/www/html/sitename/app/
? В этом случае добавьте следующую строку в начале Вашего cron.php
:
set_include_path('/var/www/html/sitename/');
Вы, возможно, также должны изменить Ваш require
операторы для включения наклонной черты вправо в начале адреса:
require '/app/bootstrap.php';
require '/app/Mage.php';
Это - действительно произвольное предположение, но включение могло бы перестать работать из-за полномочий каталога/файла.
Удостоверяются, что у пользователя, для которого Вы выполняете задание крона, есть все права получить доступ к каталогу, где cron.php
файл и все файлы, которые это открывает.
Вы, возможно, настроили полномочия для веб-сервера, который работает под www-data
, но Вы выполняете cronjob от f.e. magento
пользователь.
Вы могли бы хотеть добавить больше информации в свой вопрос о среде (id -u
) и полномочия (ls -l /var/www/html/sitename/*
) для дальнейшей отладки проблемы.
Поскольку другие упомянули, что Ваш демон крона работает правильно, но PHP имеет проблемы при нахождении необходимых файлов, которых cron.php требует для выполнения. PHP ищет, они во включать путях, указанных php.ini и дополнительно в документе, поддерживают апачский модуль таким образом, почему сам сайт работает для версии командной строки PHP, этот дополнительный путь является текущим рабочим каталогом.
Это должно работать, если Вы удостоверяетесь, что PHP выполняется от корня документа т.е. крона изменения для выполнения команды следующим образом:
*/5 * * * * cd /var/www/html/sitename && php -f /var/www/html/sitename/cron.php