Задание Magento PHP cron не может открыть требуемые файлы php

Задание Magento PHP cron не может открыть требуемые файлы php

Мы пытаемся настроить 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

Связанный контент