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?
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?
Antworten:
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.
cron.sh
Datei 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.php
von Crontab aus.
shell_exec
WHM / 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_exec
als nicht deaktiviert angesehen, versucht es zu verwenden und schlägt fehl, weil es deaktiviert ist. Achselzucken
Sie sollten verwenden cron.sh
, dh
* * * * * /bin/sh /var/www/html/magento/cron.sh
Je nach Umgebung, cron.sh
läuft cron.php
welche Läufe cron.sh
der 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.sh
werden die derzeit ausgeführten Prozesse überprüft, um festzustellen, ob sie cron.php
bereits ausgeführt werden (ohne Argumente). Wenn nicht, wird es ausgeführt
/usr/bin/php /var/www/html/magento/cron.php &
Beim cron.php
ersten 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.sh
zweiten Mal wird erneut geprüft, ob cron mit den angegebenen Parametern ausgeführt wird. Wenn nicht, wird es cron.php
mit default
oder 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.php
beim letzten Mal wird Magento dazu veranlasst, default
Cron-Jobs (fast alle) sowie always
Cron-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.
Verwenden Sie /bin/sh
diese Option , um dieses Skript zu verarbeiten
#!/bin/sh
Legen Sie eine Konstante CRONSCRIPT
fü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 always
oder default
explizit.
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cron hat keine Umgebungsvariablen, daher können Sie nicht einfach aufrufen php
. which
sagt dir, wo die PHP-Binärdatei lebt, höchstwahrscheinlich in/bin/php
PHP_BIN=`which php`
$0
ist 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.php
mit 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
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.sh
mit 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_exec
deaktiviert, werden Ereignisse ausgelöst \Aoe_Scheduler_Model_Observer::dispatchAlways
und \Mage_Cron_Model_Observer::dispatch
die Cron-Tasks ausgeführt.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}