티스토리 뷰
목표
Laravel 기본 DB 연결은 mysql 로,
Queue driver 는 Redis 로,
Queue 작업 실패시 기록하는 failed table 은 sqlite 로 설정
환경설정
/app/config/database.php
'default' => 'mysql’,
'connections' => array(
'sqlite' => array(
'driver' => 'sqlite',
'database' => __DIR__.'/../database/production.sqlite',
'prefix' => '',
),
'mysql' => array(
'driver' => 'mysql’,
……
'redis' => array(
'cluster' => false,
'default' => array(
'host' => ‘localhost',
'password' => 'dialredis',
'port' => 6379,
'database' => 0,
),
),
/app/config/queue.php
'default' => 'redis’,
'failed' => array(
'database' => 'sqlite', 'table' => 'failed_jobs',
),
위의 failed_jobs 테이블 생성을 위해
아래의 쉘 명령 실행이 필요
$ php artisan queue:failed-table
위 명령으로 생성된 파일 수정. 연결을 sqlite 로 하도록.
$ vi /app/database/migrations/xxxx_xx_xx_xxxxxx_create_failed_jobs.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFailedJobsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('sqlite')->create('failed_jobs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->text('connection')->default('');
$table->text('queue')->default('');
$table->longText('payload')->default('');
$table->longText('exception')->default('');
$table->timestamp('failed_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('sqlite')->dropIfExists('failed_jobs');
}
}
이제 DB migration 명령 실행
$ php artisan migrate
개인적으로 운영서버의 환경에서 기본 mysql 을 건드리지 않아야 하는 환경이었기에
production.sqlite DB 파일만 만들어서 업로드하여 사용하는 꼼수
를 썼고 다음과 같이 수행:
로컬에서 laravel new 쉘 명령으로 새 프로젝트 만들고
위의 과정들 수행하여
/app/database/production.sqlite
파일을 생성해 내고 운영서버의 동일 경로에 업로드.
테스팅 삽질
/app/routes.php
Route::get('queuejob/{id}', 'QueueController@queueJob')->where('id', '[0-9]+');
/app/controller/QueueController.php
class QueueController extends Controller
{
public function queueJob($id)
{
if (!isset($id) || empty($id)) return [];
// Push a job to queue
Queue::push(function ($job) use ($id)
{
$jobId = $job->getJobId();
//if (!$jobId) {
// fail 테스팅을 위해~
// $job->fail() 메쏘드 없는 대신 아래와 같이 exception 발생시키면
// failed_jobs 테이블에 삽입될거라 예상했으나 안됨!
throw new \Exception("Queue fire scratch => JobID: {$jobId} , ID: {$id}.");
//}
// 위의 exception 발생하지 않으면 아래 출력, job 삭제 다 잘된다.
// 즉, 오류나 예외 발생 없으면 queue 작동 잘 됨.
echo "JobID: {$jobId} , UID: {$id} successfully processed.";
// Delete a processed job from the queue
$job->delete();
});
}
Client 에서 fail 테스팅 (job fail 시 failed_jobs 테이블에 실패한 queue 레코드 삽입)
curl -XGET http://localhost/queuejob/111
curl -XGET http://localhost/queuejob/222
curl -XGET http://localhost/queuejob/333
curl -XGET http://localhost/queuejob/444
curl -XGET http://localhost/queuejob/555
Queue 하나 서버에서 처리 쉘 명령 해보니:
$ php artisan queue:work
[Exception]
Queue fire scratch:: JobID: 1YMs5b8FATFaIjT4fM9fWBbLyIURUgVn , UID: 111.
queue:work [--queue[="..."]] [--daemon] [--delay[="..."]] [--force] [--memory[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]
예외는 발생하고 다음의 echo 문은 실행이 안됨을 알 수 있음.
실패한 queue job 이 failed_jobs 테이블에 삽입되었는지 확인 쉘 명령:
$ php artisan queue:failed
No failed jobs!
뭐야? 예외 발생시켜도 failed 에 리스팅이 안되잖아?
구글링 하고 각종 삽질 후 아래의 해결책을 찾음.
Queue 처리 + 실패시 재시도 횟수 지정 (5번 실행, Client 에서 fail 테스팅 111 ~ 555 까지 5개 했으므로)
$ php artisan queue:work --tries=2
다시한번 실패한 queue job 이 failed_jobs 테이블에 삽입되었는지 확인 쉘 명령 수행:
$ php artisan queue:failed
+----+------------+---------+------------------------+-----------+---------------------+
| ID | Connection | Queue | Class | Failed At | |
+----+------------+---------+------------------------+-----------+---------------------+
| 5 | redis | default | IlluminateQueueClosure | | 2017-08-29 17:49:22 |
| 4 | redis | default | IlluminateQueueClosure | | 2017-08-29 17:49:22 |
| 3 | redis | default | IlluminateQueueClosure | | 2017-08-29 17:49:21 |
| 2 | redis | default | IlluminateQueueClosure | | 2017-08-29 17:49:20 |
| 1 | redis | default | IlluminateQueueClosure | | 2017-08-29 17:49:10 |
+----+------------+---------+------------------------+-----------+---------------------+
실패한 ID 5번 queue job 재시도 명령:
$ php artisan queue:retry 5
실패한 ID 5번 queue job 삭제 명령:
$ php artisan queue:forget 5
Failed job deleted successfully!
Failed job deleted successfully!
실패한 queue job 전체 삭제 명령:
$ php artisan queue:flush
All failed jobs deleted successfully!
All failed jobs deleted successfully!
데몬 모드로 실행 명령은. (테스팅이 성공하였다면..)
$ php artisan queue:work --daemon --tries=3
기타
점검 모드 (php artisan down 명령) 후 queue 데몬 재시작하려면
$ php artisan queue:restart
supervisord 에 등록하여 start. (데몬 명령이 죽으면 자동으로 되살리거나 시스템 시작시 시작하도록 하려면..)
$ sudo yum install -y supervisor
$ sudo vim /etc/supervisor/conf.d/myqueue.conf
[program:myqueue]
command=php artisan queue:work --daemon --tries=3 --sleep=3 --env=your_environment
directory=/path/to/laravel
stdout_logfile=/path/to/laravel/app/storage/logs/myqueue_supervisord.log
redirect_stderr=true
autostart=true
autorestart=true
$ sudo supervisorctl
> reread # Get available jobs
> add myqueue
> start myqueue
참고
'웹프로그래밍 > PHP' 카테고리의 다른 글
.composer/vendor/ 패키지 오류 발생시 (0) | 2018.11.29 |
---|---|
[책 후기] 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서 (0) | 2018.02.04 |
Laravel 쿼리 빌더로 self join 표현법 (0) | 2017.08.08 |
angle brackets 로 감싸진 <문장> 보존하고 html 태그 제거하고 plain text 얻기 (0) | 2016.12.21 |
macOS 용 docker 상의 php Xdebug 와 PHPStrom 연동 방법 (0) | 2016.11.15 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- Make Use Of
- How to geek
- 인터넷 통계정보 검색시스템
- 트위터 공유 정보모음
- 웹표준KR
- 치우의 컴맹탈출구
- Dev. Cheat Sheets
- w3schools
- Dev. 조각들
- ASP Ajax Library
- CSS Tricks
- WebResourcesDepot
- jQuery Selectors Tester
- DeveloperSnippets
- Smashing Magazine
- Nettuts+
- devListing
- 웹 리소스 사이트(한)
- Mobile tuts+
- Dream In Code
- Developer Tutorials
- CSS3 Previews
- 자북
- 안드로이드 사이드
- Code Visually
- Code School
- SQLer.com
- 무료 파워포인트 템플릿
- iconPot
- Free PowerPoint Templates
- Design Bombs
- Web Designer Wall
- 1st Webdesigner
- Vandelay Design
- 무료 벡터 이미지 사이트들
- Tripwire Magazine
- Web TrendSet
- WebMonkey
- 윤춘근 프리젠테이션 디자이너 블로그
- cz.cc 무료 DNS
- [웹하드] MediaFire
- [웹하드] DivShare
- 한컴 인터넷 오피스
TAG
- centos
- javascript
- API
- Wordpress
- Android
- 안드로이드
- Chrome
- sencha touch
- PHP
- Mac
- Linux
- CSS
- IE
- mssql
- git
- 한글
- Docker
- classic asp
- Debug
- iis
- JQuery
- laravel
- 워드프레스
- iphone
- Prototype
- nginx
- nodejs
- JSON
- ASP
- IOS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함