Diferença entre arquivos Shell e PHP Cron em 1.9

16

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?

Chris Morris
fonte
É melhor você usar o cron.sh, ele verificará se há algum processo cron.php em execução antes de chamá-lo.
Tai Christian

Respostas:

7

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.

mbalparda
fonte
4
O cron.sharquivo é 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.phppartir do crontab.
Fiasco Labs
Para adicionar ao @FiascoLabs, você pode ter shell_execdesabilitado o WHM / cPanel, mas isso não significa que ele é relatado como desabilitado durante as cron.phpverificações ini_get('disable_functions'). Portanto, o cron tenta executar, vê shell_execcomo não desativado, tenta usá-lo e falha porque está desativado. shrug
pspahn
7

Você deveria estar usando cron.sh, ie

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

Dependendo do seu ambiente, cron.shexecuta as cron.phpexecuções cron.shque 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.shverifica os processos em execução atuais para ver se cron.phpjá está em execução (sem argumentos). Caso contrário, ele executará

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

Na cron.phpprimeira 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.shpela segunda vez, ele verificará novamente se o cron está sendo executado com os parâmetros especificados. Caso contrário, ele passará para cron.phpou com defaultou always.

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

E cron.phppela última vez, ele acionará o Magento para executar defaulttarefas cron (praticamente todas elas), bem como alwaystarefas cron (como enterprise_refresh_index). Ao separá-los em dois processos, reduz o risco de um trabalho de longa duração de bloquear outros.

Steve Robbins
fonte
4

cron.sh

Use /bin/shpara processar este script

#!/bin/sh

Defina uma constante CRONSCRIPTcom 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 alwaysou defaultexplicitamente.

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. whichinforma 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.phpcom 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 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.shcom 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_execestiver desabilitado, despache os eventos \Aoe_Scheduler_Model_Observer::dispatchAlwayse \Mage_Cron_Model_Observer::dispatchexecute as tarefas cron.

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