Differenza tra Shell e PHP Cron file in 1.9


16

Il titolo lo riassume praticamente. C'è una differenza tra il file shell e il file php per il cron di Magento?

Se c'è una differenza, c'è un motivo per eseguirne uno anziché l'altro?


È meglio usare cron.sh, controllerà se c'è qualche processo cron.php in esecuzione prima di chiamarlo.
Tai Christian,

Risposte:


7

Cron.sh punta al file cron.php, quindi dovresti puntare la tua attività cronjob al file .sh.

Fondamentalmente all'interno del file PHP risiede tutta la logica per il cron di recuperare i lavori da Magento e il file sh invoca il file PHP.


4
Il cron.shfile è impostato per verificare che non ci sia un processo cron in esecuzione in Magento prima di avviarne uno nuovo. Usalo sempre come trigger. In alcuni schemi di sicurezza con WHM / cPanel, potresti non essere autorizzato a eseguire script di shell come cron job e solo allora esegui direttamente cron.phpda crontab.
Fiasco Labs,

Per aggiungere a @FiascoLabs potresti aver shell_execdisabilitato in WHM / cPanel, ma ciò non significa che venga segnalato come disabilitato durante i cron.phpcontrolli ini_get('disable_functions'). Quindi cron cerca di funzionare, vede shell_execcome non disabilitato, cerca di usarlo e fallisce perché è disabilitato. scrollata di spalle
pspahn

7

Dovresti usare cron.sh, ad es

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

A seconda del tuo ambiente, cron.shcorre cron.phpche corre cron.shche corre cron.php. È progettato per impedire al cron di Magento di eseguire i lavori più volte o di generare troppi processi che si sovrappongono.


La prima volta che viene eseguito, cron.shcontrollerà i processi in esecuzione correnti per vedere se cron.phpè già in esecuzione (senza alcun argomento). In caso contrario, verrà eseguito

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

Al cron.phpprimo avvio (e a seconda che il tuo sistema operativo / host lo supporti) verrà generato di cron.sh nuovo , due volte, ma questa volta passando argomenti:

/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 &

Di nuovo cron.shper la seconda volta, controllerà di nuovo per vedere se cron è in esecuzione con i parametri specificati. In caso contrario, lo riporterà a cron.phpcon defaulto always.

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

E cron.phpper l'ultima volta, attiverà Magento per eseguire defaultcron job (praticamente tutti), nonché alwayscron job (come enterprise_refresh_index). Separandoli in due processi riduce il rischio che un lavoro di lunga durata blocchi gli altri.


4

cron.sh

Utilizzare /bin/shper elaborare questo script

#!/bin/sh

Imposta una costante CRONSCRIPTcon il file da chiamare. $ 1 è il primo argomento, comecron.sh /whatever/path/cron.php

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

imposta un'altra costante, qui puoi passare alwayso defaultesplicitamente.

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

cron non ha variabili d'ambiente, quindi non puoi semplicemente chiamare php. whichti dice dove vive il binario php, molto probabilmente/bin/php

PHP_BIN=`which php`

$0è il file stesso, come __FILE__in php

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

Non so esattamente come funziona, ma ciò che fa: chiamata cron.phpcon 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

Come già detto, cron non ha una directory di lavoro o qualsiasi altra variabile d'ambiente, quindi la directory di lavoro è impostata.

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

Se chiami cron.php per curl o qualcosa del genere, i nomi dei file sono corretti?

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

Imposta umask, che definisce con quali autorizzazioni vengono creati i nuovi file: zero autorizzazioni, a nessuno è permesso fare nulla.

umask(0);

Assicurarsi che siano consentite tutte le funzioni necessarie.

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

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

se cronmode non è impostato, chiamiamo cron.shcon entrambe le modalità

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

E poi magento sta finalmente facendo il suo lavoro:

  • caricare osservatori di eventi e aggiungerli al pool di osservatori

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

se shell_execè disabilitato, invia eventi, quindi \Aoe_Scheduler_Model_Observer::dispatchAlwayse \Mage_Cron_Model_Observer::dispatchsta eseguendo le attività cron.

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.