답변:
cron.sh가 cron.php 파일을 가리키고 있으므로 cronjob 태스크가 .sh 파일을 가리켜 야합니다.
기본적으로 PHP 파일 내부에는 cron이 Magento에서 작업을 검색하는 모든 논리가 있으며 sh 파일은 PHP 파일을 호출합니다.
cron.sh
파일은 새로운 하나를 시작하기 전에 젠토에서 실행되는 크론 프로세스가 없는지 확인하도록 설정되어 있습니다. 항상 트리거로 사용하십시오. WHM / cPanel을 사용하는 특정 보안 체계에서는 쉘 스크립트를 크론 작업으로 실행할 수 없으며 cron.php
crontab에서 직접 실행해야합니다 .
shell_exec
WHM / 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 작업을뿐만 아니라, always
cron 작업 (같은 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
. which
PHP 바이너리가 어디에서 살고 있는지를 알려줍니다./bin/php
PHP_BIN=`which php`
$0
__FILE__
PHP 에서와 같이 파일 자체입니다.
# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`
이것이 어떻게 작동하는지 확실하지 않지만 그것이 무엇을하는지 : call cron.php
with 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);
}