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?
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?
Risposte:
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.
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.
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
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.
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
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);
}