ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PHP/Linux/Ubuntu] crontab으로 PHP 스케줄링 세팅
    Linux 2021. 2. 21. 21:38

    서버에서 주기적으로 데이터베이스의 상태를 파악해서 실행되어야 하는 경우가 있다.

    하루에 한번, 1시간에 한 번, 5분에 한번 등 특정 시간마다, 함수를 실행시켜 무언가 변화된 부분이 있거나 했을 때

    액션을 취하는 경우다.

     

    현재 개발하고 있는 플랫폼에서는 DB에서 물건의 상태가 변경되는 것을 캐치한 후,

    사용자에게 알림톡을 발송해야 하는 경우가 있어, 해당 기능을 이용했다.

    이 외에도, 가상계좌의 유효기간 만료, 안심번호 만료 안내 등 다양한 경우가 있을 것이다.

     

    예제는 AzureVM, Linux Ubuntu, Apache2 를 사용중이다.

    현재 개발하고 있는 플랫폼은 Codeigniter를 통해 개발을 하고 있어, CI코드를 통해 예제를 보여주고자 한다.

     

    PHP스케줄링은 리눅스 서버에서 crontab을 사용하여 세팅할 수 있다.

     

    간단하게 알아야 할 명령어는 크게 2가지가 있다.

     

    crontab -e : 스케줄링 작업 수정

    crontab -l : 스케줄링 된 작업 리스트 보기

     

    $ crontab -l

     위 명령어를 서버에서 입력하면 아래와 같은 내용이 나올 것이다.

    # Edit this file to introduce tasks to be run by cron.
    # 
    # Each task to run has to be defined through a single line
    # indicating with different fields when the task will be run
    # and what command to run for the task
    # 
    # To define the time you can provide concrete values for
    # minute (m), hour (h), day of month (dom), month (mon),
    # and day of week (dow) or use '*' in these fields (for 'any').# 
    # Notice that tasks will be started based on the cron's system
    # daemon's notion of time and timezones.
    # 
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    # 
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
    # 
    # For more information see the manual pages of crontab(5) and cron(8)
    # 
    # m h  dom mon dow   command

    스케줄링된 작업이 없다면 위와 같이 나올 것이다.

    위 내용은 crontab 사용법이다.

     

    스케줄링을 돌리기 위한 세팅을 하기 위해선

    $ crontab -e

    위의 명령어를 입력해야 한다.

    그렇다면 GNU Nano 형태의 텍스트 편집기가 열리며 아래와 같은 내용이 나올 것이다.

    # daemon's notion of time and timezones.
    # 
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    # 
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
    # 
    # For more information see the manual pages of crontab(5) and cron(8)
    # 
    # m h  dom mon dow   command
    00 00 * * * php /var/www/ver1/html/index.php cron vbank_expire_chk
    */3 * * * * php /var/www/ver1/html/index.php cron chk_server_status
    */29 * * * * php /var/www/ver1/html/index.php cron chk_chat_status

    위 코드는 개발 중인 서버의 실제 스케줄링 상태이다.

     

    매일 00시00분에 /var/www/ver1/html/index.php의 cron Class에서 vbank_expire_chk 함수를 실행시키라는 명령어다.

    00 00 * * * php /var/www/ver1/html/index.php cron vbank_expire_chk

     

    4분 간격으로 함수를 실행시키라는 명령어

    */3 * * * * php /var/www/ver1/html/index.php cron chk_server_status

     

    30분 간격으로 chk_chat_status를 실행시키라는 명령어

    */29 * * * * php /var/www/ver1/html/index.php cron chk_chat_status

     

    위에 명령어처럼

    crontab -e를 통해 편집기를 오픈한 후, 가장 하단에 내가 원하는 주기의 원하는 함수를 실행시키기만 하면 된다

     

    PHP코드는 아래와 같이 세팅되어 있다.

    class Cron extends CI_Controller {
        function __construct() {
            parent::__construct();
            // this controller can only be called from the command line
            // 해당 컨트롤러는 CLI에서만 실행되도록 처리
            if (!$this->input->is_cli_request()) show_error('Direct access is not allowed');
        }
    
        function chk_chat_status() {
            $this->load->model('Sql/E_odream/e_message');
            
            // 현재 시간이 deadline보다 크면 상태 변경
            $chat_status_end = $this->e_message->updateChatStatusEnd('cud');
        }
    }

     

    모든 세팅이 끝났다면, 서버를 재시작 해주면 된다.

    $ sudo service apache2 restart

     

    댓글

Designed by Tistory.