특정 작업을 비동기적으로 처리해야 할 일이 생겼습니다.
라라벨의 큐를 사용하기 위해서는 드라이버를 선택해야하는데 기존에 mysql 을 사용중이었기때문에 database 로 설정했습니다.
버전
laravel 9.x
PHP 8.0
DB 테이블 추가
Job을 담아둘 데이터베이스 테이블을 아래와 같이 생성합니다.
php artisan queue:table
php artisan migrate --path=database/migrations/create_jobs_table.php
실패한 Job 에 대한 정보를 담아둘 테이블을 아래와 같이 생성합니다.
php artisan queue:failed-table
php artisan migrate --path=database/migrations/create_failed_jobs_table.php
.env 설정
QUEUE_CONNECTION=database
Job 파일 생성 및 호출
php artisan make:job JobTreatment
위 명령어를 터미널에서 입력하면 app/Jobs 폴더아래에 JobTreatment.php 파일이 생성됩니다.
아래와 같이 handle 함수내에 원하는 작업을 코딩하시면 됩니다.
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Log::info("Treatment");
}
해당 job 을 실행하기 위해서는 아래와 같이 호출해줍니다.
JobTreatment::dispatch();
만약 전달해야할 파라메타가 있는 경우 dispatch 함수 호출시 전달하고 JobTreatment.php 파일내의 __construct 함수에서 받아서 처리하시면 됩니다.
큐 워커 실행
큐 워커는 큐에서 job 을 가져와 실제 실행하는 프로세스입니다.
job 이 DB 에 쌓여 있으면 그것을 가져와 순차적으로 처리합니다.
터미널에서 아래의 명령어로 실행할 수 있습니다.
php artisan queue:work
Supervisor 설치 및 실행
로컬에서는 큐 워커 실행만으로 테스트가 가능한데 실제 운영 서버에서는 Supervisor 를 설치해야 합니다.
Supervisor 는 설정파일에 따라 큐 워커를 실행하고 모니터링하여 프로세스가 중지되었을때 다시 시작 시킵니다.
아래는 우분투 서버에서 supervisoer 설치 명령어입니다.
sudo apt-get install supervisor
아래와 같은 설정파일을 만들어 큐 워커를 관리할 수 있습니다.
/etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /web/app.com/artisan queue:work
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
;user=forge
numprocs=10
redirect_stderr=true
stdout_logfile=/web/log/worker.log
stopwaitsecs=3600
numprocs 값을 변경하여 큐 워커의 프로세스 개수를 지정할 수 있습니다.
마지막으로 supervisor 를 실행해야 큐워커가 실행되므로 아래와 같이 supervisor 를 실행합니다.
sudo supervisorctl start laravel-worker:*
아직 로컬에서만 큐를 실행해보고 운영서버에는 적용하지 않았습니다.
해보고 변경사항이 있으면 다시 글을 수정하도록 하겠습니다.
추가내용
운영서버가 CentOS7 이라서 설정 파일을 아래의 폴더에 저장했습니다.
/etc/supervisord.d/laravel-worker.ini
supervisor 설정 파일 위치
/etc/supervisord.conf
설정파일의 내용을 보면 하단에 아래와 같이 추가 파일 설정값이 있어 라라벨 큐 실행 설정 파일을 ini로 추가했습니다.
변경이 필요하시면 아래의 값을 변경하시면 됩니다.
[include]
files = supervisord.d/*.ini
그리고 CentOS7 에서 실행방법은 아래와 같습니다.
sudo systemctl start supervisord
이상입니다~
'개발 > PHP 라라벨' 카테고리의 다른 글
OSX(MacBook) 에 php5.3 설치하기 (0) | 2023.05.18 |
---|---|
웹에서 애플로그인 (Sign In with Apple) 구현을 위한 설정 (0) | 2023.03.17 |
withTrashed does not exist 에러 (0) | 2021.07.22 |
DataTables 엑셀 다운받기에서 셀렉트 박스 (0) | 2021.06.29 |
DataTables 상태값 유지 (데이터 소스를 서버 측 처리 ) (1) | 2021.03.15 |