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.sh
file è 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.php
da crontab.
shell_exec
disabilitato in WHM / cPanel, ma ciò non significa che venga segnalato come disabilitato durante i cron.php
controlli ini_get('disable_functions')
. Quindi cron cerca di funzionare, vede shell_exec
come 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.sh
corre cron.php
che corre cron.sh
che 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.sh
controllerà 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.php
primo 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.sh
per la seconda volta, controllerà di nuovo per vedere se cron è in esecuzione con i parametri specificati. In caso contrario, lo riporterà a 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 &
E cron.php
per l'ultima volta, attiverà Magento per eseguire default
cron job (praticamente tutti), nonché always
cron job (come enterprise_refresh_index
). Separandoli in due processi riduce il rischio che un lavoro di lunga durata blocchi gli altri.
Utilizzare /bin/sh
per elaborare questo script
#!/bin/sh
Imposta una costante CRONSCRIPT
con 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 always
o default
esplicitamente.
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
cron non ha variabili d'ambiente, quindi non puoi semplicemente chiamare php
. which
ti 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.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
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.sh
con 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::dispatchAlways
e \Mage_Cron_Model_Observer::dispatch
sta eseguendo le attività cron.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}