답변:
cron.sh가 cron.php 파일을 가리키고 있으므로 cronjob 태스크가 .sh 파일을 가리켜 야합니다.
기본적으로 PHP 파일 내부에는 cron이 Magento에서 작업을 검색하는 모든 논리가 있으며 sh 파일은 PHP 파일을 호출합니다.
cron.sh파일은 새로운 하나를 시작하기 전에 젠토에서 실행되는 크론 프로세스가 없는지 확인하도록 설정되어 있습니다. 항상 트리거로 사용하십시오. WHM / cPanel을 사용하는 특정 보안 체계에서는 쉘 스크립트를 크론 작업으로 실행할 수 없으며 cron.phpcrontab에서 직접 실행해야합니다 .
shell_execWHM / cPanel에서 비활성화 했을 수 있지만 이것이 cron.php확인 시 비활성화 된 것으로보고되는 것은 아닙니다 ini_get('disable_functions'). 크론 시도 실행 그래서,보고 shell_exec등의 하지 를 사용하려고, 장애인이 사용할 수 없기 때문에 실패합니다. 어깨를 으
을 사용해야합니다 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). 이를 두 개의 프로세스로 분리하면 장기 실행 작업으로 인해 다른 사람을 차단할 위험이 줄어 듭니다.
/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에는 작업 디렉토리 또는 다른 환경 변수가 없으므로 작업 디렉토리가 설정됩니다.
// 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);
}