Мы пытаемся настроить cron-задание для сайта Magento.
Мы попробовали выполнить эту работу, но она нам не подошла:
*/5 * * * * php -f /var/www/html/sitename/cron.php
Для отладки мы попробовали выполнить следующее задание:
*/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);
}
решение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';
решение2
Это действительно дикое предположение, но включение может быть не выполнено из-за прав доступа к каталогу/файлу.
Убедитесь, что пользователь, для которого вы запускаете задание cron, имеет все права на доступ к каталогу, в котором cron.php
находится файл, и ко всем файлам, которые он открывает.
Возможно, вы настроили разрешения для веб-сервера, работающего под управлением www-data
, но вы запускаете cronjob от имени magento
пользователя fe.
Возможно, вам захочется добавить в свой вопрос больше информации о среде ( id -u
) и разрешениях ( ls -l /var/www/html/sitename/*
) для дальнейшего устранения проблемы.
решение3
Как уже упоминали другие, ваш демон cron работает правильно, но у PHP возникают проблемы с поиском требуемых файлов, которые требуются cron.php для выполнения. PHP ищет их в путях включения, указанных в php.ini, а также в корне документа для модуля apache, поэтому сам сайт работает; для версии PHP для командной строки этот дополнительный путь является текущим рабочим каталогом.
Это должно сработать, если вы убедитесь, что PHP выполняется из корня документа, т.е. измените cron для запуска команды следующим образом:
*/5 * * * * cd /var/www/html/sitename && php -f /var/www/html/sitename/cron.php