1.9의 셸과 PHP Cron 파일의 차이점


16

제목은 거의 요약합니다. Magento cron의 셸 파일과 php 파일 사이에 차이점이 있습니까?

차이가 있다면 다른 하나 대신 실행할 이유가 있습니까?


cron.sh를 사용하는 것이 좋습니다. 호출하기 전에 cron.php 프로세스가 실행 중인지 확인합니다.
Tai Christian

답변:


7

cron.sh가 cron.php 파일을 가리키고 있으므로 cronjob 태스크가 .sh 파일을 가리켜 야합니다.

기본적으로 PHP 파일 내부에는 cron이 Magento에서 작업을 검색하는 모든 논리가 있으며 sh 파일은 PHP 파일을 호출합니다.


4
cron.sh파일은 새로운 하나를 시작하기 전에 젠토에서 실행되는 크론 프로세스가 없는지 확인하도록 설정되어 있습니다. 항상 트리거로 사용하십시오. WHM / cPanel을 사용하는 특정 보안 체계에서는 쉘 스크립트를 크론 작업으로 실행할 수 없으며 cron.phpcrontab에서 직접 실행해야합니다 .
Fiasco Labs

@FiascoLabs에 추가하기 위해 shell_execWHM / cPanel에서 비활성화 했을 수 있지만 이것이 cron.php확인 시 비활성화 된 것으로보고되는 것은 아닙니다 ini_get('disable_functions'). 크론 시도 실행 그래서,보고 shell_exec등의 하지 를 사용하려고, 장애인이 사용할 수 없기 때문에 실패합니다. 어깨를 으
pspahn

7

을 사용해야합니다 cron.sh. 즉

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

사용자의 환경에 따라 cron.sh실행 cron.php되는 실행 cron.sh하는 실행됩니다 cron.php. Magento의 cron이 여러 번 작업을 실행하거나 너무 많은 프로세스가 겹치지 않도록 설계되었습니다.


처음 실행될 cron.sh때 현재 실행중인 프로세스를 확인하여 cron.php인수없이 이미 실행 중인지 확인합니다 . 그렇지 않으면 실행됩니다

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

cron.php최초의 실행 (및 OS / 호스트 지원을 경우에 따라)가 스폰 cron.sh 다시 두 번, 이번에는 인수를 전달 :

/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 &

다시 cron.sh두 번째로, cron이 지정된 매개 변수로 실행 중인지 다시 확인합니다. 그렇지 않을 경우에 다시 전달됩니다 cron.php와 하나 default또는 always.

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

그리고에 cron.php마지막으로, 그것은 실행 젠토를 트리거 default(거의 그들 모두를) cron 작업을뿐만 아니라, alwayscron 작업 (같은 enterprise_refresh_index). 이를 두 개의 프로세스로 분리하면 장기 실행 작업으로 인해 다른 사람을 차단할 위험이 줄어 듭니다.


4

cron.sh

/bin/sh이 스크립트를 처리하는 데 사용

#!/bin/sh

CRONSCRIPT호출 할 파일로 상수 를 설정하십시오 . 첫 번째 인수는 $ 1입니다.cron.sh /whatever/path/cron.php

# location of the php binary
if [ ! "$1" = "" ] ; then
    CRONSCRIPT=$1
else
    CRONSCRIPT=cron.php
fi

다른 상수를 설정하십시오. 여기에서 전달 always하거나 default명시 적으로 지정할 수 있습니다 .

MODE=""
if [ ! "$2" = "" ] ; then
    MODE=" $2"
fi

cron에는 환경 변수가 없으므로 호출 할 수 없습니다 php. whichPHP 바이너리가 어디에서 살고 있는지를 알려줍니다./bin/php

PHP_BIN=`which php`

$0__FILE__PHP 에서와 같이 파일 자체입니다.

# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`

이것이 어떻게 작동하는지 확실하지 않지만 그것이 무엇을하는지 : call cron.phpwith 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

이미 말했듯이 cron에는 작업 디렉토리 또는 다른 환경 변수가 없으므로 작업 디렉토리가 설정됩니다.

// 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;
}

curl 또는 다른 방법으로 cron.php를 호출하면 파일 이름이 고정됩니까?

// 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);

새 파일이 생성되는 권한을 정의하는 umask를 설정합니다. 권한이 없으면 아무 것도 할 수 없습니다.

umask(0);

필요한 모든 기능이 허용되는지 확인하십시오.

$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

세트 $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) {

cronmode가 설정되어 있지 않으면 cron.sh두 모드로 모두 호출 합니다

            $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;
        }
    }

그리고 magento는 마침내 그 일을하고 있습니다 :

  • 이벤트 옵저버를로드하고 옵저버 풀에 추가

    Mage::getConfig()->init()->loadEventObservers('crontab');
    Mage::app()->addEventArea('crontab');

경우 shell_exec사용할 수 없습니다, 그래서 이벤트를 전달 \Aoe_Scheduler_Model_Observer::dispatchAlways하고 \Mage_Cron_Model_Observer::dispatch크론 작업을 실행하고 있습니다.

    if ($isShellDisabled) {
        Mage::dispatchEvent('always');
        Mage::dispatchEvent('default');
    } else {
        Mage::dispatchEvent($cronMode);
    }
} catch (Exception $e) {
    Mage::printException($e);
    exit(1);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.