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?
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?
Respuestas:
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.
cron.sh
archivo 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.php
desde crontab.
shell_exec
deshabilitado en WHM / cPanel, pero eso no significa que se informe como deshabilitado cuando se cron.php
verifica ini_get('disable_functions')
. Entonces cron intenta ejecutarse, ve shell_exec
que no está deshabilitado, intenta usarlo y falla porque está deshabilitado. encogimiento de hombros
Deberías estar usando cron.sh
, es decir
* * * * * /bin/sh /var/www/html/magento/cron.sh
Dependiendo de su entorno, se cron.sh
ejecuta cron.php
qué se ejecuta cron.sh
qué 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.sh
verificará los procesos actuales en ejecución para ver si cron.php
ya se está ejecutando (sin ningún argumento). Si no, se ejecutará
/usr/bin/php /var/www/html/magento/cron.php &
En cron.php
la 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.sh
por segunda vez, volverá a verificar si cron se está ejecutando con los parámetros especificados. De lo contrario, lo pasará de nuevo cron.php
con default
o always
.
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
Y cron.php
por última vez, activará a Magento para ejecutar default
trabajos cron (casi todos), así como always
trabajos cron (como enterprise_refresh_index
). Al separarlos en dos procesos, reduce el riesgo de que un trabajo de larga duración bloquee a otros.
Use /bin/sh
para procesar este script
#!/bin/sh
Establezca una constante CRONSCRIPT
con 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 always
o default
explícitamente.
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cron no tiene ninguna variable de entorno, por lo tanto, no puede simplemente llamar php
. which
le dice dónde vive el binario php, muy probablemente en/bin/php
PHP_BIN=`which php`
$0
es 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.php
con 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
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.sh
con 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_exec
está deshabilitado, despacha eventos, \Aoe_Scheduler_Model_Observer::dispatchAlways
y \Mage_Cron_Model_Observer::dispatch
ejecuta las tareas cron.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}