PHP 는 php-resque 라 이브 러 리 를 사용 하여 Redis 와 함께 MQ 메시지 큐 를 실현 하 는 튜 토리 얼 을 사용 합 니 다.
프로젝트 에서 백 스테이지 에서 작업 을 실행 하 는 수요 가 자주 있 습 니 다.예 를 들 어 메 일 을 보 낼 때 메 일 서버 에 연결 하려 면 5-10 초,심지어 더 긴 시간 이 필요 합 니 다.만약 에 사용자 에 게 성공 적 인 알림 정 보 를 준 다음 에 백 스테이지 에서 메 일 을 보 내 는 작업 을 천천히 처리 하면 더욱 좋 은 사용자 체험 을 할 수 있 습 니 다.
비슷 한 수 요 를 실현 하기 위해 웹 프로젝트 의 일반적인 실현 방법 은 메시지 큐(Message Queue)를 사용 하 는 것 이다.예 를 들 어 MemcacheQ,RabbitMQ 등 은 모두 유명한 제품 이다.
메시지 대기 열 은 가장 간단 한 선진 적 인 대기 열 이 고 대기 열의 한 구성원 은 텍스트 입 니 다.바로 메시지 대기 열 이 너무 간단 하기 때문에 메시지 대기 열 을 들 고 있 을 때 오히려 손 쓸 수 없 는 느낌 이 듭 니 다.메 일 을 보 내 는 임무 하나 로 많은 문 제 를 일 으 킬 수 있 기 때 문 입 니 다.
상기 문제 들 에 대해 지금까지 제 가 찾 을 수 있 는 가장 좋 은 답 은 php 가 아니 라 Ruby 에서 온 프로젝트 Resque 입 니 다.바로 Resque 가 배경 임무 가 가 져 온 일련의 문 제 를 명확 하고 간단하게 해 결 했 기 때 문 입 니 다.Resque 의 디자인 도 Clone 에서 Python,phop,NodeJs 등 언어 에 의 해 이 루어 졌 습 니 다.예 를 들 어 Python 에서 의 pyres 와 PHP 에서 의 phop-resque 등 입 니 다.여기 에는 다양한 언어 버 전의 Resque 가 실 현 됩 니 다.이 로그 에서 우 리 는 당연히 PHP 버 전 을 예 로 들 어 phop-resque 로 배경 작업 을 어떻게 실행 하 는 지 설명해 야 합 니 다.일부 세부 적 인 부분 은 Ruby 버 전과 차이 가 있 을 수 있 지만 본 고 는 phop 버 전 을 기준 으로 합 니 다.
Resque 는 이렇게 이 문제 들 을 해결 합 니 다.
백 스테이지 퀘 스 트 의 역할 구분
사실 위의 문 제 를 통 해 알 수 있 듯 이 하나의 메시지 대기 열 만 으로 는 모든 문 제 를 해결 할 수 없고 새로운 캐릭터 의 개입 이 필요 하 다.Resque 에서 하나의 배경 임 무 는 추상 적 인 이유 로 세 가지 역할 이 공동으로 완성 된다.
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 이름과 일치 합 니 다:PHPJob3.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 가지 상태 가 있 습 니 다.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 를 볼 수 있 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.