Diferencia entre los archivos Shell y PHP Cron en 1.9

16

El título lo resume más o menos. ¿Hay alguna diferencia entre el archivo de shell y el archivo php para el cron de Magento?

Si hay una diferencia, ¿hay alguna razón para ejecutar una en lugar de la otra?

Chris Morris
fuente
Es mejor que use cron.sh, verificará si hay algún proceso cron.php ejecutándose antes de llamarlo.
Tai Christian

Respuestas:

7

El cron.sh apunta al archivo cron.php, por lo que debería apuntar su tarea cronjob al archivo .sh.

Básicamente, dentro del archivo PHP reside toda la lógica para que el cron recupere trabajos de Magento y el archivo sh invoca el archivo PHP.

mbalparda
fuente
44
El cron.sharchivo está configurado para verificar que no haya un proceso cron ejecutándose en Magento antes de comenzar uno nuevo. Úselo siempre como disparador. Bajo ciertos esquemas de seguridad con WHM / cPanel, es posible que no se le permita ejecutar scripts de shell como trabajos cron y solo entonces se ejecuta directamente cron.phpdesde crontab.
Fiasco Labs
Para agregar a @FiascoLabs, es posible que haya shell_execdeshabilitado en WHM / cPanel, pero eso no significa que se informe como deshabilitado cuando se cron.phpverifica ini_get('disable_functions'). Entonces cron intenta ejecutarse, ve shell_execque no está deshabilitado, intenta usarlo y falla porque está deshabilitado. encogimiento de hombros
pspahn
7

Deberías estar usando cron.sh, es decir

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

Dependiendo de su entorno, se cron.shejecuta cron.phpqué se ejecuta cron.shqué se ejecuta cron.php. Está diseñado para evitar que el cron de Magento ejecute trabajos varias veces o genere demasiados procesos que se superponen.


La primera vez que se ejecute, cron.shverificará los procesos actuales en ejecución para ver si cron.phpya se está ejecutando (sin ningún argumento). Si no, se ejecutará

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

En cron.phpla primera ejecución (y dependiendo de si su sistema operativo / host lo admite) se generará cron.sh nuevamente , dos veces, pero esta vez pasando argumentos:

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

De nuevo cron.shpor segunda vez, volverá a verificar si cron se está ejecutando con los parámetros especificados. De lo contrario, lo pasará de nuevo cron.phpcon defaulto always.

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

Y cron.phppor última vez, activará a Magento para ejecutar defaulttrabajos cron (casi todos), así como alwaystrabajos cron (como enterprise_refresh_index). Al separarlos en dos procesos, reduce el riesgo de que un trabajo de larga duración bloquee a otros.

Steve Robbins
fuente
4

cron.sh

Use /bin/shpara procesar este script

#!/bin/sh

Establezca una constante CRONSCRIPTcon el archivo para llamar. $ 1 es el primer argumento, comocron.sh /whatever/path/cron.php

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

establezca otra constante, aquí puede pasar alwayso defaultexplícitamente.

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

cron no tiene ninguna variable de entorno, por lo tanto, no puede simplemente llamar php. whichle dice dónde vive el binario php, muy probablemente en/bin/php

PHP_BIN=`which php`

$0es el archivo en sí, como __FILE__en php

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

No estoy seguro exactamente cómo funciona esto, pero qué hace: llamar 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

Como ya se dijo, cron no tiene un directorio de trabajo ni ninguna otra variable de entorno, por lo tanto, el directorio de trabajo está configurado.

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

Si llamas a cron.php por curl o algo así, ¿los nombres de los archivos son fijos?

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

Establezca umask, que define con qué permisos se crean los nuevos archivos: cero permisos, nadie tiene permitido hacer nada.

umask(0);

Asegúrese de que se permiten todas las funciones que se necesitan.

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

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

si cronmode no está configurado, llamamos cron.shcon ambos modos

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

Y entonces magento finalmente está haciendo su trabajo:

  • cargar observadores de eventos y agregarlos al grupo de observadores

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

si shell_execestá deshabilitado, despacha eventos, \Aoe_Scheduler_Model_Observer::dispatchAlwaysy \Mage_Cron_Model_Observer::dispatchejecuta las tareas cron.

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
Fabian Blechschmidt
fuente