활동메달 모듈 크론탭으로 실행으로 메달 부여하기 문의
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.2 |
동봉된 crontab.php 파일이 라이믹스 2.0에서만 지원이 된다고 하셔서 새로 커스텀해서 만들어 보려고 합니다.
관리자가 메달동기화 하는 함수 자체를 옮겨 봤는데요.
https://github.com/bjrambo/experience/blob/master/experience.admin.controller.php#L179
여기 함수 전체를 corntab_custom.php 로 만들었습니다.
<?php
define('__XE__', true);
require_once('../../config/config.inc.php'); //XE config.inc.php 주소
$oContext = Context::getInstance();
$oContext->init();
@set_time_limit(0);
$config=getModel('experience')->getConfig();
$output = executeQuery('experience.deleteAllMedal');
debugPrint($output);
// 무조건 지난달.
$toMonthFirstDay = mktime(0, 0, 0, date("m"), 1, date("Y"));
$prev_month = strtotime("-1 month", $toMonthFirstDay);
$prevMonth = date('Ym', $prev_month);
/** @var experienceModel $oExperienceModel */
$oExperienceModel = getModel('experience');
$args = new stdClass();
$args->regdate = $prevMonth;
$args->exception_member = $config->exception_member;
$MonthOutput = executeQuery('experience.getMonthRank', $args);
$rankCount = 1;
foreach ($MonthOutput->data as $monthDatum)
{
$medalString = "없음";
if ($rankCount == intval($config->medal_diamond))
{
$medal = 'diamond';
$medalString = '다이아몬드';
}
elseif ($rankCount > intval($config->medal_diamond) && $rankCount <= intval($config->medal_platinum))
{
$medal = 'platinum';
$medalString = '플레티넘';
}
elseif ($rankCount > intval($config->medal_platinum) && $rankCount <= intval($config->medal_gold))
{
$medal = 'gold';
$medalString = '골드';
}
elseif ($rankCount > intval($config->medal_gold) && $rankCount <= intval($config->medal_silver))
{
$medal = 'silver';
$medalString = '실버';
}
elseif ($rankCount > intval($config->medal_silver) && $rankCount <= intval($config->medal_bronze))
{
$medal = 'bronze';
$medalString = '브론즈';
}
$args = new stdClass();
$args->member_srl = $monthDatum->member_srl;
$args->medal = $medal;
$args->update_regdate = $prevMonth;
$medas = $oExperienceModel->getMedalByMemberSrl($monthDatum->member_srl);
if ($medas)
{
$output = executeQuery('experience.updateMedal', $args);
}
else
{
$output = executeQuery('experience.insertMedal', $args);
}
$rankCount++;
//메달 흭득 알림(알림센터)
if (is_dir('../../modules/ncenterlite'))
{
$oNcenterliteController = getController('ncenterlite');
$body = new stdClass;
$body->medal = $medalString;
$args = new stdClass;
$args->member_srl = $monthDatum->member_srl;
$args->srl = 1;
$args->target_srl = 1;
$args->target_p_srl = 1;
$args->type = 'U';
$args->target_type = 'U';
$args->notify_type = $config->medal_update_ntype;
$args->target_body = serialize($body);
$args->target_url = getUrl('');
$args->regdate = date('YmdHis');
$args->notify = $oNcenterliteController->_getNotifyId($args);
$output = $oNcenterliteController->_insertNotify($args);
}
}
echo "Success";
define('__XE__', true);
require_once('../../config/config.inc.php'); //XE config.inc.php 주소
$oContext = Context::getInstance();
$oContext->init();
@set_time_limit(0);
$config=getModel('experience')->getConfig();
$output = executeQuery('experience.deleteAllMedal');
debugPrint($output);
// 무조건 지난달.
$toMonthFirstDay = mktime(0, 0, 0, date("m"), 1, date("Y"));
$prev_month = strtotime("-1 month", $toMonthFirstDay);
$prevMonth = date('Ym', $prev_month);
/** @var experienceModel $oExperienceModel */
$oExperienceModel = getModel('experience');
$args = new stdClass();
$args->regdate = $prevMonth;
$args->exception_member = $config->exception_member;
$MonthOutput = executeQuery('experience.getMonthRank', $args);
$rankCount = 1;
foreach ($MonthOutput->data as $monthDatum)
{
$medalString = "없음";
if ($rankCount == intval($config->medal_diamond))
{
$medal = 'diamond';
$medalString = '다이아몬드';
}
elseif ($rankCount > intval($config->medal_diamond) && $rankCount <= intval($config->medal_platinum))
{
$medal = 'platinum';
$medalString = '플레티넘';
}
elseif ($rankCount > intval($config->medal_platinum) && $rankCount <= intval($config->medal_gold))
{
$medal = 'gold';
$medalString = '골드';
}
elseif ($rankCount > intval($config->medal_gold) && $rankCount <= intval($config->medal_silver))
{
$medal = 'silver';
$medalString = '실버';
}
elseif ($rankCount > intval($config->medal_silver) && $rankCount <= intval($config->medal_bronze))
{
$medal = 'bronze';
$medalString = '브론즈';
}
$args = new stdClass();
$args->member_srl = $monthDatum->member_srl;
$args->medal = $medal;
$args->update_regdate = $prevMonth;
$medas = $oExperienceModel->getMedalByMemberSrl($monthDatum->member_srl);
if ($medas)
{
$output = executeQuery('experience.updateMedal', $args);
}
else
{
$output = executeQuery('experience.insertMedal', $args);
}
$rankCount++;
//메달 흭득 알림(알림센터)
if (is_dir('../../modules/ncenterlite'))
{
$oNcenterliteController = getController('ncenterlite');
$body = new stdClass;
$body->medal = $medalString;
$args = new stdClass;
$args->member_srl = $monthDatum->member_srl;
$args->srl = 1;
$args->target_srl = 1;
$args->target_p_srl = 1;
$args->type = 'U';
$args->target_type = 'U';
$args->notify_type = $config->medal_update_ntype;
$args->target_body = serialize($body);
$args->target_url = getUrl('');
$args->regdate = date('YmdHis');
$args->notify = $oNcenterliteController->_getNotifyId($args);
$output = $oNcenterliteController->_insertNotify($args);
}
}
echo "Success";
위와 같이 작성해서 저 경로 파일을 서버에서 한번 실행하는 것으로 하려고 하는데
/usr/bin/curl -s "https://도메인경로/modules/experience/crontab.php" > /dev/null 2>&1
이런식으로 하면 저 파일이 제대로 동작을 하는 것을 확인했습니다.
제가 시도한 것 중 고쳐야 하거나 하는 부분이 있을지 문의 드립니다.
PS. 무작위로 파일이 실행되는 것을 방지하기 위해 상단에 저희 서버 아이피만 동작되도록 코드를 추가할 생각입니다.
- 알림센터 알림이 발생하기 때문에..
댓글 9
https://github.com/bjrambo/experience/blob/master/crontab.php#L17
해당줄
$oExperienceController = getController('experience');
으로 수정하셔서 해당 파일 로딩하세요.
말씀하신대로 고쳐서
php /var/www/html/modules/experience/crontab.php > /dev/null 2>&1
이렇게 해봤는데 안되네요.
/usr/bin/curl -s "https://도메인/modules/experience/crontab.php" > /dev/null 2>&1
이렇게 하면 됩니다.(단, 관리자 동기화에 있는 알림센터 기능은 빠져있죠.)
보통은 php 명령어로 잘 실행되거든요.ㅠ
라이믹스 기본제공 스트립트는 잘 되거든요.
파일안의 config.inc.php 경로가 없는 경로나 파일이라고 합니다.
require_once('/var/www/html/config/config.inc.php');
이제 제가 만든 커스텀을 쓸건지 기본 제공하는 것을 쓸 건지 선택적으로 사용하면 될 것 같습니다.
그런데 제가 만든 것에 오류가 있을지도 몰라서요 ㅎ
cd /var/www/html && php ./modules~ 해보세요!
실행하는 거는 해결했습니다. 지금 처럼 상대경로로 되어 있으면 경로 문제가 생겨서 절대경로로 해서 해결은 했습니다. 위에 댓글에 적었습니다. 실행 자체가 안되는게 아니고 실행하면서 안에 적힌 상대경로가 문제가 됩니다. config.inc.php 파일의 경로 문제..
해결은 했습니다.