O título resume bastante. Existe uma diferença entre o arquivo de shell e o arquivo php para o Magento cron?
Se houver uma diferença, existe um motivo para executar um em vez do outro?
O título resume bastante. Existe uma diferença entre o arquivo de shell e o arquivo php para o Magento cron?
Se houver uma diferença, existe um motivo para executar um em vez do outro?
Respostas:
O cron.sh está apontando para o arquivo cron.php, portanto, você deve apontar sua tarefa cronjob para o arquivo .sh.
Basicamente, dentro do arquivo PHP, reside toda a lógica para o cron recuperar tarefas do Magento e o arquivo sh chama o arquivo PHP.
cron.sh
arquivo é configurado para verificar se não há um processo cron em execução no Magento antes de iniciar um novo. Sempre use-o como gatilho. Sob certos esquemas de segurança com o WHM / cPanel, você pode não ter permissão para executar scripts de shell como tarefas cron e somente então você executa diretamente a cron.php
partir do crontab.
shell_exec
desabilitado o WHM / cPanel, mas isso não significa que ele é relatado como desabilitado durante as cron.php
verificações ini_get('disable_functions')
. Portanto, o cron tenta executar, vê shell_exec
como não desativado, tenta usá-lo e falha porque está desativado. shrug
Você deveria estar usando cron.sh
, ie
* * * * * /bin/sh /var/www/html/magento/cron.sh
Dependendo do seu ambiente, cron.sh
executa as cron.php
execuções cron.sh
que executam cron.php
. Ele foi projetado para impedir que o cron do Magento execute tarefas várias vezes, ou gerando muitos processos que se sobrepõem.
Na primeira vez em que é executado, cron.sh
verifica os processos em execução atuais para ver se cron.php
já está em execução (sem argumentos). Caso contrário, ele executará
/usr/bin/php /var/www/html/magento/cron.php &
Na cron.php
primeira execução (e dependendo do seu sistema operacional / host), ele aparecerá cron.sh
novamente , duas vezes, mas desta vez passando 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 volta cron.sh
pela segunda vez, ele verificará novamente se o cron está sendo executado com os parâmetros especificados. Caso contrário, ele passará para cron.php
ou com default
ou always
.
/usr/bin/php /var/www/html/magento/cron.php -mdefault &
/usr/bin/php /var/www/html/magento/cron.php -malways &
E cron.php
pela última vez, ele acionará o Magento para executar default
tarefas cron (praticamente todas elas), bem como always
tarefas cron (como enterprise_refresh_index
). Ao separá-los em dois processos, reduz o risco de um trabalho de longa duração de bloquear outros.
Use /bin/sh
para processar este script
#!/bin/sh
Defina uma constante CRONSCRIPT
com o arquivo a ser chamado. $ 1 é o primeiro argumento, comocron.sh /whatever/path/cron.php
# location of the php binary
if [ ! "$1" = "" ] ; then
CRONSCRIPT=$1
else
CRONSCRIPT=cron.php
fi
defina outra constante, aqui você pode passar always
ou default
explicitamente.
MODE=""
if [ ! "$2" = "" ] ; then
MODE=" $2"
fi
O cron não possui nenhuma variável de ambiente; portanto, você não pode simplesmente chamar php
. which
informa onde o binário php está morando, provavelmente em/bin/php
PHP_BIN=`which php`
$0
é o próprio arquivo, como __FILE__
em php
# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`
Não sei exatamente como isso funciona, mas o que faz: ligar cron.php
com 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 já foi dito, o cron não possui um dir de trabalho ou qualquer outra variável de ambiente; portanto, o dir de trabalho está definido.
// 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 você chamar cron.php por curl ou algo assim, os nomes dos arquivos serão corrigidos?
// 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);
Defina umask, que define com quais permissões os novos arquivos são criados - sem permissão, ninguém tem permissão para fazer nada.
umask(0);
Certifique-se de que todas as funções são permitidas e necessárias.
$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) {
se o cronmode não estiver definido, chamaremos cron.sh
com os dois 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;
}
}
E então o magento finalmente está fazendo seu trabalho:
carregar observadores de eventos e adicioná-los ao pool de observadores
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
se shell_exec
estiver desabilitado, despache os eventos \Aoe_Scheduler_Model_Observer::dispatchAlways
e \Mage_Cron_Model_Observer::dispatch
execute as tarefas cron.
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}