-
[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
'Linux' 카테고리의 다른 글
[Linux/PHP/CI] 서버의 용량이 가득차서 접속이 안될 경우 로그파일을 확인하세요! (0) 2020.06.28 [Linux/Apache2] Let's encrypt SSL 보안인증서 갱신하는 방법 (0) 2020.05.28 [Linux/WSL] Windows10 에서 리눅스 사용하는 방법 (0) 2020.05.01 [Linux,Apache2] .git 디렉토리 접근 차단하기 (0) 2020.02.17 [Linux/Apache2] HTTP에서 HTTPS(SSL) 마이그레이션 하는 방법 (0) 2020.01.08