Q&A

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

  • 7시간 전 #1917362

    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은 안 되었을까?

    가능한 원인은 다음과 같아요.

    1. 환경 차이

      • index.php common.cron모듈 트리거까지 모두 실행 → 특정 모듈에서 에러가 나면 queue insert까지 영향을 줄 수 있음.

      • 반면 cron.php는 단순화된 로직만 실행 → 그 에러를 우회했을 수 있음.

    2. CLI 인자 전달 문제

      • index.php common.cron 방식에서 common.cron 인자가 제대로 전달되지 않으면 원하는 로직이 실행되지 않을 수 있음.

      • PHP CLI 버전 차이나 shebang 환경 문제로 발생할 수 있어요.

    3. 퍼미션/경로 문제

      • 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에 로그내용이 없어서 원인을 모르겠네요. 로그 작성하도록 설정했는데..

  • 7시간 전 #1917366

    common/scripts/cron.php를 직접 호출하는 것은 웹크론 방식입니다.

    crontab에서는 이 파일을 직접 호출하면 안 됩니다.

    만약 된다면 버그이니 차단하겠습니다.

     

    다른 작업 도중 addTask로 추가한 작업을 백그라운드에서 실행하는 것이 일반적인데,

    백그라운드 작업 도중 addTask를 하려고 하셨다는 뜻인가요?

  • 6시간 전 #1917370

    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(뿌듯) 순정상태를 유지하고 있습니다!

  • 5시간 전 #1917375

    웹 렌더링에 사용하는 함수를 addTask에 넣으시면 여러 가지 부작용이 생길 수 있습니다. 기존에 만들어진 대부분의 자료들은 웹 환경에 맞게 설계되어, 자기가 실행한 후에는 화면 출력 후 exit한다고 가정하기 때문에 state 관리에 엄격하지 않습니다.

     

    백그라운드 처리 전용 함수를 따로 만들어 써 보세요.

  • 5시간 전 #1917383

    답변 감사합니다! 내일 index.php common.cron 세팅으로 다시 바꾸고 테스트해보겠습니다 ㅠ.ㅠ