Tytuł podsumowuje. Czy istnieje różnica między plikiem powłoki a plikiem php dla cron Magento?
Jeśli istnieje różnica, czy istnieje powód, aby uruchomić jeden zamiast drugiego?
Tytuł podsumowuje. Czy istnieje różnica między plikiem powłoki a plikiem php dla cron Magento?
Jeśli istnieje różnica, czy istnieje powód, aby uruchomić jeden zamiast drugiego?
Odpowiedzi:
Plik cron.sh wskazuje na plik cron.php, więc powinieneś wskazać swoje zadanie cronjob na plik .sh.
Zasadniczo wewnątrz pliku PHP znajduje się cała logika crona do pobierania zadań z Magento, a plik sh wywołuje plik PHP.
cron.sh
Plik jest skonfigurowana, aby sprawdzić, że nie jest to proces cron działa w Magento przed rozpoczęciem nowego. Zawsze używaj go jako wyzwalacza. W ramach niektórych schematów bezpieczeństwa z WHM / cPanel, możesz nie mieć możliwości uruchamiania skryptów powłoki jako zadań cron, a dopiero potem bezpośrednio uruchamiasz się cron.php
z crontab.
shell_exec
wyłączony w WHM / cPanel, ale to nie znaczy, że jest zgłaszany jako wyłączony podczas cron.php
kontroli ini_get('disable_functions')
. Więc cron próbuje uruchomić, widzi shell_exec
jako nie wyłączony, próbuje go użyć i kończy się niepowodzeniem, ponieważ jest wyłączony. wzruszenie ramionami
Powinieneś używać cron.sh
, tj
* * * * * /bin/sh /var/www/html/magento/cron.sh
W zależności od środowiska cron.sh
działa, cron.php
które działa, cron.sh
które działa cron.php
. Został zaprojektowany tak, aby cron Magento nie wykonywał zadań wiele razy lub nie powodował zbyt wielu procesów, które się nakładają.
Przy pierwszym uruchomieniu cron.sh
sprawdzi bieżące uruchomione procesy, aby sprawdzić, czy cron.php
jest już uruchomiony (bez żadnych argumentów). Jeśli nie, wykona się
/usr/bin/php /var/www/html/magento/cron.php &
Przy cron.php
pierwszym uruchomieniu (i w zależności od tego, czy system operacyjny / host go obsługuje), odrodzi się cron.sh
ponownie , dwa razy, ale tym razem przekazując argumenty:
/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 &
Z powrotem cron.sh
po raz drugi sprawdzi ponownie, czy cron działa z określonymi parametrami. Jeśli nie, to minie go z powrotem do cron.php
albo z default
albo always
.
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
I cron.php
po raz ostatni, uruchomi Magento do uruchamiania default
zadań cron (prawie wszystkie), a także always
zadań cron (jak enterprise_refresh_index
). Dzieląc je na dwa procesy, zmniejsza ono ryzyko długotrwałego zadania przed blokowaniem innych.
Służy /bin/sh
do przetwarzania tego skryptu
#!/bin/sh
Ustaw stałą CRONSCRIPT
z plikiem do wywołania. 1 $ to pierwszy argumentcron.sh /whatever/path/cron.php
# location of the php binary
if [ ! "$1" = "" ] ; then
CRONSCRIPT=$1
else
CRONSCRIPT=cron.php
fi
ustaw kolejną stałą, tutaj możesz przekazać always
lub default
jawnie.
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cron nie ma żadnych zmiennych środowiskowych, dlatego nie można po prostu wywoływać php
. which
mówi ci, gdzie mieszka binarny php, najprawdopodobniej w/bin/php
PHP_BIN=`which php`
$0
to sam plik, jak __FILE__
w php
# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`
Nie wiem dokładnie, jak to działa, ale co to robi: zadzwoń cron.php
z 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
Jak już powiedziano, cron nie ma działającego katalogu ani żadnej innej zmiennej środowiskowej, dlatego ustawiony jest działający katalog.
// 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;
}
Jeśli wywołasz cron.php przez curl lub coś, nazwy plików są ustalone?
// 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);
Ustaw umask, który określa, z jakimi uprawnieniami tworzone są nowe pliki - zero uprawnień, nikt nie może nic robić.
umask(0);
Upewnij się, że wszystkie funkcje są dozwolone, które są potrzebne.
$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
zestaw $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) {
jeśli cronmode nie jest ustawiony, wywołujemy cron.sh
oba tryby
$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;
}
}
A potem magento wreszcie wykonuje swoją pracę:
wczytaj obserwatorów zdarzeń i dodaj ich do puli obserwatorów
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
jeśli shell_exec
jest wyłączone, wysyłaj zdarzenia, więc \Aoe_Scheduler_Model_Observer::dispatchAlways
i \Mage_Cron_Model_Observer::dispatch
uruchamiają zadania cron.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}