Unterschied zwischen Shell- und PHP-Cron-Dateien in 1.9

16

Der Titel bringt es auf den Punkt. Gibt es einen Unterschied zwischen der Shell-Datei und der PHP-Datei für den Magento-Cron?

Wenn es einen Unterschied gibt, gibt es einen Grund, einen anstelle des anderen auszuführen?

Chris Morris
quelle
Verwenden Sie besser cron.sh. Es wird geprüft, ob ein cron.php-Prozess ausgeführt wird, bevor Sie ihn aufrufen.
Tai Christian

Antworten:

7

Die Datei cron.sh verweist auf die Datei cron.php, daher sollten Sie Ihre Cronjob-Aufgabe auf die Datei .sh verweisen.

Grundsätzlich befindet sich in der PHP-Datei die gesamte Logik, die der Cron benötigt, um Jobs von Magento abzurufen, und die SH-Datei ruft die PHP-Datei auf.

mbalparda
quelle
4
Die cron.shDatei ist so eingerichtet, dass geprüft wird, ob in Magento kein Cron-Prozess ausgeführt wird, bevor ein neuer gestartet wird. Verwenden Sie es immer als Auslöser. Unter bestimmten Sicherheitsschemata mit WHM / cPanel dürfen Sie möglicherweise keine Shell-Skripte als Cron-Jobs ausführen und nur dann direkt cron.phpvon Crontab aus.
Fiasco Labs
Um zu @FiascoLabs hinzuzufügen, haben Sie möglicherweise shell_execWHM / cPanel deaktiviert. Dies bedeutet jedoch nicht, dass es bei cron.phpÜberprüfungen als deaktiviert gemeldet wird ini_get('disable_functions'). Cron versucht also auszuführen, wird shell_execals nicht deaktiviert angesehen, versucht es zu verwenden und schlägt fehl, weil es deaktiviert ist. Achselzucken
pspahn
7

Sie sollten verwenden cron.sh, dh

* * * * * /bin/sh /var/www/html/magento/cron.sh

Je nach Umgebung, cron.shläuft cron.phpwelche Läufe cron.shder Läufe cron.php. Es wurde entwickelt, um zu verhindern, dass Magentos Cron Jobs mehrmals ausführt oder zu viele überlappende Prozesse erzeugt.


Bei der ersten Ausführung cron.shwerden die derzeit ausgeführten Prozesse überprüft, um festzustellen, ob sie cron.phpbereits ausgeführt werden (ohne Argumente). Wenn nicht, wird es ausgeführt

/usr/bin/php /var/www/html/magento/cron.php &

Beim cron.phpersten Start (und abhängig davon, ob Ihr Betriebssystem / Host dies unterstützt) wird es zweimal cron.sh erneut erzeugt , diesmal jedoch mit Argumenten:

/bin/sh /var/www/html/magento/cron.sh cron.php -mdefault 1 > /dev/null 2>&1 &
/bin/sh /var/www/html/magento/cron.sh cron.php -malways 1 > /dev/null 2>&1 &

Beim cron.shzweiten Mal wird erneut geprüft, ob cron mit den angegebenen Parametern ausgeführt wird. Wenn nicht, wird es cron.phpmit defaultoder zurückgegeben always.

/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &

Und cron.phpbeim letzten Mal wird Magento dazu veranlasst, defaultCron-Jobs (fast alle) sowie alwaysCron-Jobs (wie enterprise_refresh_index) auszuführen . Durch die Aufteilung in zwei Prozesse wird das Risiko verringert, dass ein Auftrag mit langer Laufzeit andere blockiert.

Steve Robbins
quelle
4

cron.sh

Verwenden Sie /bin/shdiese Option , um dieses Skript zu verarbeiten

#!/bin/sh

Legen Sie eine Konstante CRONSCRIPTfür die aufzurufende Datei fest. $ 1 ist das erste Argument, wiecron.sh /whatever/path/cron.php

# location of the php binary
if [ ! "$1" = "" ] ; then
    CRONSCRIPT=$1
else
    CRONSCRIPT=cron.php
fi

setze eine andere Konstante, hier kannst du übergeben alwaysoder defaultexplizit.

MODE=""
if [ ! "$2" = "" ] ; then
    MODE=" $2"
fi

cron hat keine Umgebungsvariablen, daher können Sie nicht einfach aufrufen php. whichsagt dir, wo die PHP-Binärdatei lebt, höchstwahrscheinlich in/bin/php

PHP_BIN=`which php`

$0ist die datei selbst, wie __FILE__in php

# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`

Nicht ganz sicher, wie das funktioniert, aber was sie tut: Anruf cron.phpmit php.

#   prepend the intallation path if not given an absolute path
if [ "$INSTALLDIR" != "" -a "`expr index $CRONSCRIPT /`" != "1" ];then
    if ! ps auxwww | grep "$INSTALLDIR$CRONSCRIPT$MODE" | grep -v grep 1>/dev/null 2>/dev/null ; then
        $PHP_BIN $INSTALLDIR$CRONSCRIPT$MODE &
    fi
else
    if  ! ps auxwww | grep "$CRONSCRIPT$MODE" | grep -v grep | grep -v cron.sh 1>/dev/null 2>/dev/null ; then
        $PHP_BIN $CRONSCRIPT$MODE &
    fi
fi

cron.php

Wie bereits gesagt, hat cron kein Arbeitsverzeichnis oder eine andere Umgebungsvariable, daher ist das Arbeitsverzeichnis festgelegt.

// Change current directory to the directory of current script
chdir(dirname(__FILE__));

require 'app/Mage.php';

if (!Mage::isInstalled()) {
    echo "Application is not installed yet, please complete install wizard first.";
    exit;
}

Wenn du cron.php per curl oder so aufrufst, sind die Dateinamen fest?

// 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);

Setze umask, mit der festgelegt wird, mit welchen Berechtigungen neue Dateien erstellt werden - keine Berechtigungen, niemand darf etwas tun.

umask(0);

Stellen Sie sicher, dass alle Funktionen erlaubt sind, die benötigt werden.

$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

einstellen $cronmode

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) {

wenn cronmode nicht gesetzt ist, rufen wir cron.shmit beiden modi auf

            $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;
        }
    }

Und dann macht Magento endlich seine Arbeit:

  • Laden Sie Ereignisbeobachter und fügen Sie sie dem Beobachterpool hinzu

    Mage::getConfig()->init()->loadEventObservers('crontab');
    Mage::app()->addEventArea('crontab');

Wenn shell_execdeaktiviert, werden Ereignisse ausgelöst \Aoe_Scheduler_Model_Observer::dispatchAlwaysund \Mage_Cron_Model_Observer::dispatchdie Cron-Tasks ausgeführt.

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
Fabian Blechschmidt
quelle