Różnica między plikami Shell i PHP Cron w wersji 1.9

16

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?

Chris Morris
źródło
Lepiej użyj cron.sh, przed wywołaniem sprawdzi, czy jest uruchomiony jakiś proces cron.php.
Tai Christian

Odpowiedzi:

7

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.

mbalparda
źródło
4
cron.shPlik 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.phpz crontab.
Fiasco Labs,
Aby dodać do @FiascoLabs, możesz mieć shell_execwyłączony w WHM / cPanel, ale to nie znaczy, że jest zgłaszany jako wyłączony podczas cron.phpkontroli ini_get('disable_functions'). Więc cron próbuje uruchomić, widzi shell_execjako nie wyłączony, próbuje go użyć i kończy się niepowodzeniem, ponieważ jest wyłączony. wzruszenie ramionami
pspahn
7

Powinieneś używać cron.sh, tj

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

W zależności od środowiska cron.shdziała, cron.phpktóre działa, cron.shktó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.shsprawdzi bieżące uruchomione procesy, aby sprawdzić, czy cron.phpjest już uruchomiony (bez żadnych argumentów). Jeśli nie, wykona się

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

Przy cron.phppierwszym 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.shpo raz drugi sprawdzi ponownie, czy cron działa z określonymi parametrami. Jeśli nie, to minie go z powrotem do cron.phpalbo z defaultalbo always.

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

I cron.phppo raz ostatni, uruchomi Magento do uruchamiania defaultzadań cron (prawie wszystkie), a także alwayszadań cron (jak enterprise_refresh_index). Dzieląc je na dwa procesy, zmniejsza ono ryzyko długotrwałego zadania przed blokowaniem innych.

Steve Robbins
źródło
4

cron.sh

Służy /bin/shdo przetwarzania tego skryptu

#!/bin/sh

Ustaw stałą CRONSCRIPTz 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ć alwayslub defaultjawnie.

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

cron nie ma żadnych zmiennych środowiskowych, dlatego nie można po prostu wywoływać php. whichmówi ci, gdzie mieszka binarny php, najprawdopodobniej w/bin/php

PHP_BIN=`which php`

$0to 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.phpz 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

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.shoba 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_execjest wyłączone, wysyłaj zdarzenia, więc \Aoe_Scheduler_Model_Observer::dispatchAlwaysi \Mage_Cron_Model_Observer::dispatchuruchamiają zadania cron.

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
Fabian Blechschmidt
źródło