Magento PHP Cron-Job kann erforderliche PHP-Dateien nicht öffnen

Magento PHP Cron-Job kann erforderliche PHP-Dateien nicht öffnen

Wir versuchen, einen Cron-Job für die Magento-Site einzurichten.

Wir haben diesen Job ausprobiert, aber er hat bei uns nicht funktioniert:

*/5 * * * * php -f /var/www/html/sitename/cron.php

Zum Debuggen haben wir diesen Job ausprobiert:

*/5 * * * * /usr/bin/php  -q /var/www/html/sitename/cron.php > 
/var/www/html/sitename/cron-temp.log 2>&1

Als Ergebnis haben wir diese Fehler gefunden in 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);
}

Antwort1

PHP Fatal error:  require(): Failed opening required 'app/bootstrap.php' 
(include_path='.:/usr/share/php:/usr/share/pear')

Es sieht so aus, als ob Ihre requiredDateien nicht gefunden werden können und deshalb wird der Fehler ausgegeben. Ich nehme an, diese Dateien befinden sich in /var/www/html/sitename/app/? Fügen Sie in diesem Fall am Anfang Ihrer die folgende Zeile hinzu cron.php:

set_include_path('/var/www/html/sitename/');

Möglicherweise müssen Sie Ihre Anweisungen auch so ändern, requiredass am Anfang der Adresse ein Schrägstrich steht:

require '/app/bootstrap.php';
require '/app/Mage.php';

Antwort2

Das ist nur eine vage Vermutung, aber der Include könnte aufgrund von Verzeichnis-/Dateiberechtigungen fehlschlagen.

Stellen Sie sicher, dass der Benutzer, für den Sie den Cron-Job ausführen, über alle Rechte für den Zugriff auf das Verzeichnis verfügt, in dem cron.phpsich die Datei befindet, und auf alle Dateien, die sie öffnet.

Möglicherweise haben Sie die Berechtigungen für den Webserver angepasst, der unter ausgeführt wird www-data, aber Sie führen den Cronjob vom FE- magentoBenutzer aus.

Möglicherweise möchten Sie Ihrer Frage weitere Informationen zur Umgebung ( id -u) und den Berechtigungen ( ls -l /var/www/html/sitename/*) hinzufügen, um Ihr Problem weiter zu debuggen.

Antwort3

Wie andere bereits erwähnt haben, funktioniert Ihr Cron-Daemon einwandfrei, aber PHP hat Probleme, die erforderlichen Dateien zu finden, die cron.php zur Ausführung benötigt. PHP sucht in den von php.ini angegebenen Include-Pfaden und zusätzlich im Dokumentstamm für das Apache-Modul danach, weshalb die Site selbst funktioniert. Für die Befehlszeilenversion von PHP ist dieser zusätzliche Pfad das aktuelle Arbeitsverzeichnis.

Es sollte funktionieren, wenn Sie sicherstellen, dass PHP vom Dokumentstamm aus ausgeführt wird. Ändern Sie also cron, um den Befehl wie folgt auszuführen:

*/5 * * * * cd /var/www/html/sitename && php -f /var/www/html/sitename/cron.php

verwandte Informationen