PHP 는 php-resque 라 이브 러 리 를 사용 하여 Redis 와 함께 MQ 메시지 큐 를 실현 하 는 튜 토리 얼 을 사용 합 니 다.

7303 단어 PHPMQ메시지 큐
메시지 큐 처리 배경 작업 에 따 른 문제
프로젝트 에서 백 스테이지 에서 작업 을 실행 하 는 수요 가 자주 있 습 니 다.예 를 들 어 메 일 을 보 낼 때 메 일 서버 에 연결 하려 면 5-10 초,심지어 더 긴 시간 이 필요 합 니 다.만약 에 사용자 에 게 성공 적 인 알림 정 보 를 준 다음 에 백 스테이지 에서 메 일 을 보 내 는 작업 을 천천히 처리 하면 더욱 좋 은 사용자 체험 을 할 수 있 습 니 다.
비슷 한 수 요 를 실현 하기 위해 웹 프로젝트 의 일반적인 실현 방법 은 메시지 큐(Message Queue)를 사용 하 는 것 이다.예 를 들 어 MemcacheQ,RabbitMQ 등 은 모두 유명한 제품 이다.
메시지 대기 열 은 가장 간단 한 선진 적 인 대기 열 이 고 대기 열의 한 구성원 은 텍스트 입 니 다.바로 메시지 대기 열 이 너무 간단 하기 때문에 메시지 대기 열 을 들 고 있 을 때 오히려 손 쓸 수 없 는 느낌 이 듭 니 다.메 일 을 보 내 는 임무 하나 로 많은 문 제 를 일 으 킬 수 있 기 때 문 입 니 다.
  • 메시지 큐 는 문자열 형식의 데이터 만 저장 할 수 있 습 니 다.메 일 을 보 내 는'작업'을 메시지 큐 의'메시지'로 어떻게 변환 합 니까?
  • 메시지 대기 열 은 데이터 의 저장 과 출입 만 책임 지고 그 자체 가 프로그램 을 수행 할 수 없습니다.그러면 우 리 는 어떻게 메시지 대기 열 에서 데 이 터 를 하나씩 꺼 내 서 이 데 이 터 를 작업 으로 전환 시 키 고 실행 해 야 합 니까?
  • 우 리 는 메시지 대기 열 에 언제 데이터 가 생 길 지 예측 할 수 없 기 때문에 우리 의 작업 수행 프로그램 은 메시지 대기 열 을 감시 하 는 능력,즉 백 엔 드 에 상주 하 는 데 몬 이 필요 합 니 다.
  • 일반적인 웹 응용 PHP 는 cgi 방식 으로 실행 되 며 메모리 에 상주 할 수 없습니다.phop 에 cli 모드 가 있다 는 것 을 알 고 있 습 니 다.데 몬 이 phop cli 로 이 루어 질 수 있 습 니까?효율 은 어 떻 습 니까?4567918)
  • 데 몬 이 실 행 될 때 웹 응용 프로그램 은 배경 데 몬 과 상호작용 을 하여 프로 세 스 를 켜 거나 죽 이 는 기능 과 프로 세 스 의 실행 상 태 를 실현 할 수 있 습 니까?
  • Resque 백 스테이지 임무 에 대한 디자인 과 역할 구분
    상기 문제 들 에 대해 지금까지 제 가 찾 을 수 있 는 가장 좋 은 답 은 php 가 아니 라 Ruby 에서 온 프로젝트 Resque 입 니 다.바로 Resque 가 배경 임무 가 가 져 온 일련의 문 제 를 명확 하고 간단하게 해 결 했 기 때 문 입 니 다.Resque 의 디자인 도 Clone 에서 Python,phop,NodeJs 등 언어 에 의 해 이 루어 졌 습 니 다.예 를 들 어 Python 에서 의 pyres 와 PHP 에서 의 phop-resque 등 입 니 다.여기 에는 다양한 언어 버 전의 Resque 가 실 현 됩 니 다.이 로그 에서 우 리 는 당연히 PHP 버 전 을 예 로 들 어 phop-resque 로 배경 작업 을 어떻게 실행 하 는 지 설명해 야 합 니 다.일부 세부 적 인 부분 은 Ruby 버 전과 차이 가 있 을 수 있 지만 본 고 는 phop 버 전 을 기준 으로 합 니 다.
    Resque 는 이렇게 이 문제 들 을 해결 합 니 다.
    백 스테이지 퀘 스 트 의 역할 구분
    사실 위의 문 제 를 통 해 알 수 있 듯 이 하나의 메시지 대기 열 만 으로 는 모든 문 제 를 해결 할 수 없고 새로운 캐릭터 의 개입 이 필요 하 다.Resque 에서 하나의 배경 임 무 는 추상 적 인 이유 로 세 가지 역할 이 공동으로 완성 된다.
  • Job|퀘 스 트:하나의 Job 은 배경 에서 완성 해 야 할 임무 입 니 다.예 를 들 어 본 고 에서 예 를 들 어 메 일 을 보 내 면 Job 으로 추상 화 할 수 있 습 니 다.Resque 에서 Job 은 Class 입 니 다.4567918)
  • Queue|대기 열:즉,위의 메시지 대기 열 입 니 다.Resque 에서 대기 열 은 Redis 에서 이 루어 집 니 다.Resque 는 Job 을 대기 열 에 삽입/꺼 내 는 등 간단 한 대기 열 관리 자 를 제공 합 니 다.
  • Worker|실행 자:대기 열 에서 Job 을 꺼 내 실행 하고 데 몬 으로 배경 에서 실행 할 수 있 습 니 다.
  • 그러면 이 구분 을 바탕 으로 배경 작업 이 Resque 에서 의 기본 절 차 는 다음 과 같 습 니 다.
  • 배경 작업 을 독립 된 Class 로 작 성 했 습 니 다.이 Class 는 Job 입 니 다.
  • 백 엔 드 프로그램 을 사용 해 야 하 는 곳 에서 시스템 은 Job Class 의 이름과 필요 한 인 자 를 대기 열 에 넣 습 니 다.
  • 명령 행 방식 으로 Worker 를 열 고 매개 변 수 를 통 해 Worker 가 처리 해 야 할 대기 열 을 지정 합 니 다.
  • Worker 는 데 몬 으로 실행 되 며 대기 열 을 정기 적 으로 검사 합 니 다.
  • 대기 열 에 Job 이 있 을 때 Worker 는 Job 을 꺼 내 실행 합 니 다.즉,Job Class 를 예화 하고 Class 의 방법 을 실행 합 니 다.
  • 이로써 백 스테이지 작업 을 완전 하 게 수행 할 수 있 습 니 다.
    Resque 에서 또 하나의 중요 한 디자인 이 있 습 니 다.하나의 Worker 는 하나의 대기 열 을 처리 할 수 있 고 여러 개의 대기 열 을 처리 할 수 있 으 며 Worker 의 프로 세 스/스 레 드 수 를 증가 시 켜 대기 열의 실행 속 도 를 가속 화 할 수 있 습 니 다.
    php-resque 설치
    미리 설명해 야 할 것 은 프로 세 스 의 개척 과 관리 와 관련 되 기 때문에 php-resque 는 php 의 PCNTL 함 수 를 사 용 했 기 때문에 리 눅 스에 서 만 실행 할 수 있 고 php 가 PCNTL 함 수 를 컴 파일 해 야 한다.윈도 로 같은 작업 을 하고 싶다 면 리 스 크 의 다른 언어 버 전 을 찾 아 보 세 요.phop 은 윈도 에서 백 스테이지 작업 에 적합 하지 않 습 니 다.
    Ubuntu 12.04LTS 의 경우 Ubuntu 가 apt 로 설치 한 php 는 기본적으로 PCNTL 함 수 를 컴 파일 했 으 며 어떠한 설정 도 필요 하지 않 습 니 다.아래 명령 은 모두 루트 계 정 입 니 다.
    Redis 설치
    
    apt-get install redis-server
    
    Composer 설치
    
    apt-get install curl
    cd /usr/local/bin
    curl -s http://getcomposer.org/installer | php
    chmod a+x composer.phar
    alias composer='/usr/local/bin/composer.phar'
    
    Composer 로 php-resque 설치 하기
    웹 디 렉 터 리 가/opt/htdocs 에 있다 고 가정 합 니 다.
    
    apt-get install git git-core
    cd /opt/htdocs
    git clone git://github.com/chrisboulton/php-resque.git
    cd php-resque
    composer install
    
    pp-resque 사용
    1.Worker 만 들 기
    사실 php-resque 는 간단 한 예 를 제 시 했 습 니 다.demo/job.php 파일 은 가장 간단 한 Job 입 니 다.
    
    class PHP_Job
    {
      public function perform()
      {
        sleep(120);
        fwrite(STDOUT, 'Hello!');
      }
    }
    
    이 Job 은 바로 120 초 후에 STDOUT 에 문 자 를 출력 합 니 다 Hello!
    Resque 디자인 에서 Job 은 perform 방법 이 있어 야 하고 Worker 는 이 방법 을 자동 으로 실행 합 니 다.
    2.Job 을 대기 열 에 삽입
    php-resque 도 가장 간단 한 삽입 대기 열 을 제시 하여 demo/queue.php 를 실현 합 니 다.
    
    if(empty($argv[1])) {
      die('Specify the name of a job to add. e.g, php queue.php PHP_Job');
    }
    
    require __DIR__ . '/init.php';
    date_default_timezone_set('GMT');
    Resque::setBackend('127.0.0.1:6379');
    
    $args = array(
      'time' => time(),
      'array' => array(
        'test' => 'test',
      ),
    );
    
    $jobId = Resque::enqueue('default', $argv[1], $args, true);
    echo "Queued job ".$jobId."

    ";
    이 예 에서 queue.php 는 cli 방식 으로 실행 되 어야 합 니 다.cli 가 받 은 첫 번 째 인 자 를 Job 이름 으로 하고'default'라 는 대기 열 을 삽입 하 며 방금 대기 열 에 삽 입 된 Job Id 를 화면 에 출력 해 야 합 니 다.터미널 에 입력:
    
    php demo/queue.php PHP_Job
    
    결 과 는 화면 출력 을 볼 수 있 습 니 다:
    
    Queued job b1f01038e5e833d24b46271a0e31f6d6
    
    Job 이 추가 되 었 습 니 다.이 곳 의 Job 이름 은 우리 가 작성 한 Job Class 이름과 일치 합 니 다:PHPJob
    3.Job 실행 상황 보기
    php-resque 역시 Job 실행 상 태 를 보 는 예 를 제공 합 니 다.직접 실행:
    
    php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
    
    다음 출력 을 볼 수 있 습 니 다:
    
    Tracking status of b1f01038e5e833d24b46271a0e31f6d6. Press [break] to stop. 
    Status of b1f01038e5e833d24b46271a0e31f6d6 is: 1
    
    우리 가 방금 만 든 Job 상 태 는 1 입 니 다.Resque 에서 한 Job 은 다음 과 같은 4 가지 상태 가 있 습 니 다.
  • Resque_Job_Status::STATUS_WAITING = 1; (대기)
  • Resque_Job_Status::STATUS_RUNNING = 2; (실행 중)
  • Resque_Job_Status::STATUS_FAILED = 3; (실패)
  • Resque_Job_Status::STATUS_COMPLETE = 4; (종료)
  • Worker 가 실행 되 지 않 았 기 때문에 방금 만 든 Job 은 대기 상태 입 니 다.
    4.Worker 실행
    이번 에는 demo/resque.php 를 직접 작성 합 니 다.
    
    <?php
    date_default_timezone_set('GMT');
    require 'job.php';
    require '../bin/resque';
    
    Worker 가 두 부분 이상 필요 한 것 을 볼 수 있 습 니 다.
    Job 클래스 파일 을 직접 포함 할 수도 있 고 phop 의 자동 로 딩 체 제 를 사용 할 수도 있 습 니 다.Job Class 가 있 는 경 로 를 지정 하고 자동 으로 로 딩 할 수 있 습 니 다.
    Resque 를 포함 하 는 기본 Worker:bin/resque
    터미널 에서 실행:
    
    QUEUE=default php demo/resque.php
    
    앞의 QUEUE 부분 은 환경 변 수 를 설정 합 니 다.현재 Worker 는 default 대기 열 만 처리 하도록 지정 합 니 다.사용 가능
    
    QUEUE=* php demo/resque.php
    
    모든 대기 열 을 처리 합 니 다.
    실행 후 출력
    
    #!/usr/bin/env php
    *** Starting worker
    
    ps 명령 으로 검사 하기:
    
    ps aux | grep resque
    
    phop 데 몬 이 실행 되 고 있 는 것 을 볼 수 있 습 니 다.
    
    1000   4607 0.0 0.1 74816 11612 pts/3  S+  14:52  0:00 php demo/resque.php
    
    이전 검사 Job 명령 사용 하기
    
    php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
    
    2 분 뒤에 볼 수 있어 요.
    
    Status of b1f01038e5e833d24b46271a0e31f6d6 is: 4
    
    작업 이 완료 되 었 습 니 다.동시에 화면 에 출력 된 Hello 를 볼 수 있 습 니 다!

    좋은 웹페이지 즐겨찾기