CMS/프레임워크 | Rhymix 2.1 |
---|---|
개발 언어 | PHP 7.4 |
라이믹스 비동기 기능은 시스템 설정에서 아래 같이 설치하도록 되어있고, 정상적으로 작동합니다.
* * * * * /usr/bin/php /내경로/www/index.php common.cron >> /home/momeng/logs/queue.log 2>&1
그런데 어제 무슨 작업을 하는데 이상하게 안되는 부분이 있어서 하다하다가
위 경로 대신에 아래 경로로 설정 하니까 잘 되더라구요.. 잘안된 부분은 addtask 를 통해서 xe_task_queue 에 큐를 넣는 일이었어요. 아래 경로로 바꿔도 기존 기능에도 문제가 없고 다 해결되긴 했는데 궁금하기도 하고 찜찜하기도 해서 문의드려요.
* * * * * /usr/bin/php /내경로/www/common/scripts/cron.php
스코스코
Lv. 5
댓글 5
Rhymix 비동기 실행 방식
라이믹스는 기본적으로 index.php common.cron 형태를 통해 크론이 실행되도록 설계되어 있습니다.
/usr/bin/php /내경로/www/index.php common.cron
index.php
→ 코어 부트스트랩을 거치면서 전체 환경을 로드common.cron
→ Rhymix에서 예약된 작업(비동기 큐, 세션/캐시 정리, 모듈 크론 등)을 실행즉, 이것이 공식적으로 권장되는 표준 방식이에요.
/common/scripts/cron.php
실행/usr/bin/php /내경로/www/common/scripts/cron.php
이 경로는
index.php
를 거치지 않고 cron.php 단독 실행 스크립트를 호출하는 방식입니다.이 스크립트는 원래 개발/테스트용 혹은 단순화된 환경에서 크론을 돌리기 위한 백도어처럼 존재하는데, 환경 초기화 절차가
index.php
방식보다 단순합니다.장점: 큐 처리(addtask →
xe_task_queue
)가 빠르게 동작할 수 있음단점: index.php 로딩 과정을 건너뛰므로 특정 모듈이나 트리거가 누락될 수 있음
왜
cron.php
는 되고index.php common.cron
은 안 되었을까?가능한 원인은 다음과 같아요.
환경 차이
index.php common.cron
은 모듈 트리거까지 모두 실행 → 특정 모듈에서 에러가 나면 queue insert까지 영향을 줄 수 있음.반면
cron.php
는 단순화된 로직만 실행 → 그 에러를 우회했을 수 있음.CLI 인자 전달 문제
index.php common.cron
방식에서common.cron
인자가 제대로 전달되지 않으면 원하는 로직이 실행되지 않을 수 있음.PHP CLI 버전 차이나 shebang 환경 문제로 발생할 수 있어요.
퍼미션/경로 문제
queue.log
확인해보면, index.php 실행 시 특정 모듈에서 Warning이나 Fatal이 발생해 큐 추가가 막혔을 가능성 있음.어떻게 쓰는 게 안전할까?
공식적이고 안정적인 방식은
index.php common.cron
입니다.cron.php
는 임시 대안으로 쓸 수 있지만, 장기적으로는 권장되지 않아요.지금처럼
cron.php
가 잘 되는 상황은 사실 underlying 에러를 가리고 있는 것일 가능성이 큽니다.👉 따라서, queue.log를 확인해서 index.php common.cron 실행 시 무슨 에러가 났는지 추적하는 게 중요합니다.
(아마 특정 모듈의 트리거나 함수에서 오류가 나서 addtask 실행까지 방해했을 확률이 높습니다.)
정리
index.php common.cron
= 표준, 모든 기능/트리거 정상 실행cron.php
= 단순 실행, 일부 문제를 회피할 수 있지만 비권장지금은
cron.php
가 잘 되는 게 아니라,index.php common.cron
실행 중간에 오류가 있어서 addtask가 막힌 것일 가능성이 큼 → 로그 확인이 필요chatgpt 답변을 보니 이러면 안되는거구나 싶긴한데 /logs/queue.log에 로그내용이 없어서 원인을 모르겠네요. 로그 작성하도록 설정했는데..
common/scripts/cron.php를 직접 호출하는 것은 웹크론 방식입니다.
crontab에서는 이 파일을 직접 호출하면 안 됩니다.
만약 된다면 버그이니 차단하겠습니다.
다른 작업 도중 addTask로 추가한 작업을 백그라운드에서 실행하는 것이 일반적인데,
백그라운드 작업 도중 addTask를 하려고 하셨다는 뜻인가요?
1. 즉시 발송 시 배치 처리
\Rhymix\Framework\Queue::addTask('new ggmailingAdminController()->sendRecipientsChunk', $reArgs);
2. 재큐잉 처리
$task_id = \Rhymix\Framework\Queue::addTask('new ggmailingAdminController()->sendRecipientsChunk', $reArgs);
3. 청크 처리 후 재큐잉
\Rhymix\Framework\Queue::addTask('new ggmailingAdminController()->sendRecipientsChunk', $args);
우리알림 서버을 수정하는 작업을 하고 있는데 대량 메일을 2000명씩 끊어서 배치를 만들고, 각 배치는 300명씩 청크로 나눠서 큐잉하도록 하고 있어요. 즉시 발송 시 배치 처리는 잘되는데 청크 처리가 안되서 본문의 방법으로 바꾸었더니 잘되더라구요.
요약:
- index.php common.cron이 큐 워커가 아닌 웹 렌더링 경로로 동작 → HTML이 로그에 섞임.
- common/scripts/cron.php로 교체 후 자동 청크 처리 정상화.
일단 다시 한번 테스트를 해봐야겠습니다.
---
테스트 해본 결과 (common/scripts/cron.php 세팅) 약 4000건의 매일이 3개의 배치로 나눠지고 청크당 300개씩 나눠서 잘 발송되었습니다. index.php common.cron 세팅으로 다시 바꾸고 테스트를 해야하는데 dry-run 기능을 넣었지만 실제 발송을 안하는거라 queue에 들어가질 않아 테스트가 어렵습니다. 메일 발송이다 보니 함부로 막할수도 없어서 다음 발송 건이 있을때까지 기다려보겠습니다.
---
추가 질문. common/scripts/cron.php 으로 했을때만 정상 작동하는게 맞다면 어떤 잘못을 한건지 예상할만한 이유가 있을까요? 현재 라이믹스 버젼은 2.1.26(뿌듯) 순정상태를 유지하고 있습니다!
웹 렌더링에 사용하는 함수를 addTask에 넣으시면 여러 가지 부작용이 생길 수 있습니다. 기존에 만들어진 대부분의 자료들은 웹 환경에 맞게 설계되어, 자기가 실행한 후에는 화면 출력 후 exit한다고 가정하기 때문에 state 관리에 엄격하지 않습니다.
백그라운드 처리 전용 함수를 따로 만들어 써 보세요.
답변 감사합니다! 내일 index.php common.cron 세팅으로 다시 바꾸고 테스트해보겠습니다 ㅠ.ㅠ