Laravel 프레임 워 크 대기 열 원리 와 용법 분석

본 논문 의 사례 는 Laravel 프레임 워 크 대열 의 원리 와 용법 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
최근 에 어떤 친구 가 laravel 대열 의 실현 원리 와 경험 을 물 어 봤 는데 마침 써 봤 기 때문에 정 리 를 해서 여러분 께 나 눠 드 렸 습 니 다.
laravel 대기 열 설정 참조:http://d.laravel-china.org/docs/5.1/queues
원리 분석
배포 작업 방법 만 들 기

class TestController extends Controller
{
  //    
  //    
  public function SendMessage(Request $request){
    ...
    $this->dispatch((new SendMessage($sendParams))->onQueue('snail:SendMessage'));
  }
}

내부 구현:

소비 작업 생 성
명령 행 은 다음 명령 을 실행 합 니 다:
/home/niuyufu/php/bin/php /home/niuyufu/webroot/assistant_api/artisan queue:work --queue=snail:SendMessage --tries=3 --memory=512 --daemon
내부 구현:

대기 열 메시지 분석:
redis 가 대응 하 는 대기 열 정 보 를 감시 하고 구체 적 으로 발생 하 는 정보 조작 은 다음 과 같 습 니 다.
tail -f | redis-cli -h 10.94.120.13 -p 6380 monitor | grep "queues:snail"
1492446053.406282 [0 10.95.117.155:57132] "WATCH" "queues:snail:SendMessage:delayed"
1492446053.406452 [0 10.95.117.155:57132] "ZRANGEBYSCORE" "queues:snail:SendMessage:delayed" "-inf" "1492446053"
1492446053.406754 [0 10.95.117.155:57132] "WATCH" "queues:snail:SendMessage:reserved"
1492446053.406842 [0 10.95.117.155:57132] "ZRANGEBYSCORE" "queues:snail:SendMessage:reserved" "-inf" "1492446053"
1492446053.407029 [0 10.95.117.155:57132] "LPOP" "queues:snail:SendMessage"
1492446053.407700 [0 10.95.117.155:57132] "ZADD" "queues:snail:SendMessage:reserved" "1492446113" "{job}"
1492446053.463953 [0 10.95.117.155:57132] "ZREM" "queues:snail:SendMessage:reserved" "{job}"
PS:만약 당신 의 redis 가 codis 라면,주의 하 세 요.왜냐하면 codis 가 방법 목록 을 사용 하지 않 기 때 문 입 니 다.
KEYS, MOVE, OBJECT, RENAME, RENAMENX, SORT, SCAN, BITOP,MSETNX, BLPOP, BRPOP, BRPOPLPUSH, PSUBSCRIBE,PUBLISH, PUNSUBSCRIBE, SUBSCRIBE, UNSUBSCRIBE, DISCARD, EXEC, MULTI, UNWATCH, WATCH, SCRIPT EXISTS, SCRIPT FLUSH, SCRIPT KILL, SCRIPT LOAD, AUTH, ECHO, SELECT, BGREWRITEAOF, BGSAVE, CLIENT KILL, CLIENT LIST, CONFIG GET, CONFIG SET, CONFIG RESETSTAT, DBSIZE, DEBUG OBJECT, DEBUG SEGFAULT, FLUSHALL, FLUSHDB, INFO, LASTSAVE, MONITOR, SAVE, SHUTDOWN, SLAVEOF, SLOWLOG, SYNC, TIME
따라서 소비 임 무 를 수행 하 는 데 다음 과 같은 오류 가 발생 할 수 있 습 니 다.
[Predis\Connection\ConnectionException]
Error while reading line from the server. [tcp://100.90.154.39:3000]
해결 방법 은 config/queue.php 수정 입 니 다.

'redis' => [
  'driver' => 'redis',
  'connection' => 'default',
  'queue' => 'default',
  'expire' => null,  //    
],

로그 처리 최적화:
시스템 에 파일 로 그 를 자 르 는 작업 이 있다 면.로그 가 잘 렸 지만 프로그램 이 새 파일 에 쓰 이지 않 은 것 을 발견 할 수 있 습 니 다.예 를 들 어 2017-04-18 13:50 에 시 작 된 프로젝트 의 로 그 는 snail.log.2017041813 에 전 화 됩 니 다.
개선 방안:
app/Jobs/Job.php 파일 에 다음 과 같은 방법 을 추가 합 니 다.

public function releaseLoggerFile(){
  $handles=\Log::getMonolog()->getHandlers();
  if(!is_array($handles) || empty($handles)){
    return;
  }
  foreach($handles as $handle){
    if(method_exists($handle, "close")){
      $handle->close();
    }
  }
  return;
}

구체 적 인 job 구현 클래스 의 handle 방법 끝 에 추가:

public function handle()
{
  ...
  $this->releaseLoggerFile(); //  log  
}

온라인 배치
작업 셸 만 들 기

#!/bin/sh
day=$(date +'%y%m%d')
now=$(date +"%F %T")
php_command="/home/niuyufu/php/bin/php"
command="/home/niuyufu/webroot/snail_api/artisan"
log="/home/niuyufu/webroot/log/wave"
queue_name_arr=("snail:SendMessage" "snail:SendMessageToApp")
case $1 in
"run")
  for queue_name in ${queue_name_arr[*]}
  do
    count=$(ps aux | grep artisan |grep queue=${queue_name} | grep -v grep | wc -l)
    if [ ${count} -lt 1 ];then
      echo "${now}:${queue_name} process has exit ${count}
"; nohup $php_command $command queue:work --queue=${queue_name} --tries=3 --memory=512 --daemon >> $log/queueMonitor.log 2>&1 & else echo "${now}:${queue_name} process is runing"; fi done ;; "stop") kill -9 $(ps -ef | grep "queue:work" | grep -v grep | awk '{print $2}' | tr -s '
' ' ') echo ${now}."Queue process all stop"; ;; "list") ps -ef | grep "queue:work" | grep -v grep ;; *) echo " Usage: QueueMonitorCommandShell.sh [run|stop|list] " ;; esac
요약:
laravel 이쪽 지연 대기 열 은 세 개의 대기 열 을 사 용 했 습 니 다.
queue:default:delayed//저장 지연 작업
queue:default//"생"작업 을 저장 하면 처리 되 지 않 은 작업 입 니 다.
queue:default:reserved//처리 할 작업 저장
작업 은 세 개의 대기 열 에서 순환 합 니 다.마지막 으로 quue:default:reserved 에 들 어가 고 성공 한 후에 작업 을 이 대기 열 에서 삭제 합 니 다.
laravel 5.1 은 워 치 를 사용 하여 대기 열의 원자 조작 을 제어 하지만,codis 자체 가 워 치 방법 을 지원 하지 않 기 때문이다.따라서 codis 를 사용 하면 대기 열 기능 을 완전히 체험 할 수 없습니다.지연 대기 열 은 지원 되 지 않 고 데이터 재 주 를 지원 하지 않 으 며 온라인 데이터 에 대해 비교적 엄격 하고 신중하게 사용 합 니 다.
laravel 5.3 이후 redis 대기 열 은 lua 스 크 립 트 가 지원 하 는 대기 열 원자 작업 을 시작 합 니 다.watch multi 등 을 사용 하지 않 았 기 때문에 온라인 codis 가 lua 를 지원 하면 대기 열 기능 을 완전 하 게 체험 할 수 있 습 니 다.
참고 문서:
https://laravel-china.org/articles/4169/analysis-of-laravel-message-queue
http://laravelacademy.org/post/2012.html
Laravel 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 는 Laravel 프레임 워 크 를 바탕 으로 하 는 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기