Który skrypt crona najlepiej uruchomić? cron.php lub cron.sh

27

Magento udostępnia dwa skrypty cron w swoim katalogu głównym, cron.php i cron.sh.

Który z nich jest lepszy i dlaczego?

Joe
źródło

Odpowiedzi:

31

Najlepiej byłoby uruchomić cron.sh

Począwszy od Magento EE 1.13.x i CE 1.8.x, mechanika cron uległa zmianie, gdy Magento wprowadziło nową funkcję trybu planowania.

Dostępne są 2 tryby: 1. domyślny - uruchamia zaplanowane crons. 2. zawsze - jak sama nazwa wskazuje, zadania te będą bezwarunkowo wykonywane za każdym razem, gdy uruchamiany jest cron i nie potrzebują wyraźnie zdefiniowanych harmonogramów.

Zasadniczo wywołanie cron.php bez żadnych parametrów używa shell_exec do wykonania dwóch procesów cron.sh. Każdy z innym parametrem („domyślny” lub „zawsze”). Cron.sh z kolei przekazuje ten parametr z powrotem do cron.php, który następnie wykonuje cron. Wewnętrznie Magento wykorzystuje swoją infrastrukturę zdarzeń do przetwarzania dwóch trybów poprzez wysyłanie zdarzeń o nazwach „default” i „always”. Mage_Cron następnie implementuje dwie metody obserwatora.

Patrząc na cron.php, zauważysz użycie funkcji PHP shell_exec. Oprócz obaw związanych z bezpieczeństwem, funkcja może zwrócić NULL zarówno wtedy, gdy wystąpi błąd lub program nie generuje danych wyjściowych. Za pomocą tej funkcji nie można wykryć błędów wykonania. Oznacza to, że w dowolnym momencie, w którym skrypt / kod zawiedzie z powodu błędu, dzieje się, co następuje: 1. Praca z cronjob staje się nieaktualna, 2. Błąd nie jest rejestrowany, 3. i nikt nie wie, że coś takiego się wydarzyło.

Aby temu zaradzić, należy dodać następujące działania typu cronjob:

*/5 *   * * *   www-data /bin/sh /path/to/magento/cron.sh cron.php -m=default
*/5 *   * * *   www-data /bin/sh /path/to/magento/cron.sh cron.php -m=always

Zapewni to, że tryby procesu będą zawsze działały bez użycia awaryjnej funkcji PHP shell_exec i że cron nie powinien stać się nieaktualny, ponieważ wyjątek jest zgłaszany, jeśli wystąpi błąd.

Shaughn
źródło
Dodam tylko, że powyższe przykładowe wyrażenie cron jest dość ogólne. www-datazmieniłby się na cokolwiek użytkownik uruchamia procesy serwera WWW. Warto również zauważyć, że w przypadku wielu konfiguracji hostingu CPanel / WHM shell_exec()zostanie on wyłączony.
pspahn
*/5 * * * * www-data /bin/sh /path/to/magento/cron.sh cron.php -m=default */5 * * * * www-data /bin/sh /path/to/magento/cron.sh cron.php -m=alwaysi te polecenia powodują błąd „polecenie nie znaleziono” autorstwa nupur walia
Amit Bera
Jeśli pojawi się ten błąd, musisz sprawdzić 3 rzeczy: 1) www-data to właściwy użytkownik na tym serwerze, który może uruchomić ten proces, w przeciwnym razie zmień go na dowolnego użytkownika. 2) sprawdź lokalizację sh, więc uruchom „która sh” i powinna wypisać lokalizację, to zastąpi „/ bin / sh”, jeśli jest to inna ścieżka. 3) na koniec sprawdź, czy ścieżka do pliku cron.sh jest rzeczywiście poprawna.
Shaughn,
@AmitBera Otrzymywałem ten sam komunikat o błędzie i nie mogłem go uruchomić z danymi www, rootem ani żadnym innym użytkownikiem. Właśnie pominąłem użytkownika i teraz działa, więc*/5 * * * * /bin/sh /path/to/magento/cron.sh cron.php -m=default
Michael,
@Shaughn, czy możesz wyjaśnić, jaki jest tryb domyślny i zawsze tryb?
Rohan Hapani