php-resque 사용 지침

小云云
풀어 주다: 2023-03-20 12:32:01
원래의
2567명이 탐색했습니다.

프로젝트에서 백그라운드에서 작업을 실행해야 하는 경우가 종종 있습니다. 예를 들어 이메일을 보낼 때 사용자에게 성공적인 프롬프트 메시지를 보낼 수 있다면 메일 서버에 연결하는 데 5~10초 이상이 걸리는 경우가 많습니다. 먼저 이메일 전송 작업을 백그라운드에서 처리하면 분명히 더 나은 사용자 경험을 제공할 수 있습니다.

유사한 요구 사항을 충족하기 위해 웹 프로젝트의 일반적인 구현 방법은 모두 잘 알려진 제품인 MemcacheQ, RabbitMQ 등과 같은 메시지 큐(Message Queue)를 사용하는 것입니다.

직접 말하면 메시지 대기열은 가장 간단한 선입선출 대기열이며 대기열의 구성원은 텍스트 조각입니다. 정확하게는 메시지 대기열이 너무 간단하기 때문에 메시지 대기열을 보관할 때 약간 혼란스러워집니다. 이는 단지 이메일을 보내는 작업일 뿐이므로 많은 문제가 발생할 수 있기 때문입니다.

  1. 메시지 대기열은 문자만 저장할 수 있습니다. 문자열 형식의 데이터, 이메일 보내기 등의 "작업"을 메시지 큐에서 "메시지"로 변환하는 방법은 무엇입니까?

  2. 메시지 큐는 데이터 저장 및 입력만 담당하고 프로그램 자체를 실행할 수는 없습니다. , 그래서 우리는 메시지 큐에서 데이터를 하나씩 검색하고, 데이터를 다시 작업으로 변환하고 실행하는 방법을 알아야 합니다.

  3. 메시지 대기열이 언제 데이터를 생성할지 예측할 수 없으므로 작업 실행 프로그램에는 백그라운드에 상주하는 데몬 프로세스인 메시지 대기열을 모니터링하는 기능도 있어야 합니다.

  4. 일반 웹 애플리케이션 PHP는 cgi 모드에서 실행되며 메모리에 상주할 수 없습니다. PHP에도 CLI 모드가 있다는 것을 알고 있는데, PHP CLI를 사용하여 데몬 프로세스를 구현할 수 있으며 얼마나 효율적일까요?

  5. 데몬이 실행 중일 때 웹 애플리케이션이 백그라운드 데몬과 상호 작용하여 프로세스 시작/종료 기능을 실현하고 프로세스의 실행 상태를 얻을 수 있나요?


Resque는 이러한 문제를 다음과 같이 해결합니다.

백그라운드 작업의 역할 분할

실제로 하나의 메시지 대기열만으로는 모든 문제를 해결할 수 없으며 새로운 역할이 필요하다는 것을 위의 문제에서 볼 수 있습니다. 간섭. Resque에서는 백그라운드 작업이 세 가지 역할로 완료되도록 추상화됩니다.

  • Job | 작업: Job은 백그라운드에서 완료되어야 하는 작업입니다. 예를 들어 이 문서의 예로 이메일을 보낼 수 있습니다. Job으로 추상화됩니다. Resque에서 Job은 클래스입니다.

  • Queue: 위의 메시지 큐입니다. Resque에서 큐는 Redis에 의해 구현됩니다. Resque는 대기열에서 작업 삽입/제거와 같은 기능을 구현할 수 있는 간단한 대기열 관리자도 제공합니다.

  • Worker | Executor: 대기열에서 작업을 꺼내어 실행하는 역할을 하며 백그라운드에서 데몬 프로세스로 실행될 수 있습니다.

이 구분을 바탕으로 Resque에서 백그라운드 작업의 기본 프로세스는 다음과 같습니다.

  1. 백그라운드 작업을 독립 클래스로 작성하며 이 클래스가 Job입니다.

  2. 백그라운드 프로그램을 사용해야 하는 경우 시스템은 작업 클래스 이름과 필수 매개변수를 대기열에 넣습니다.

  3. 명령줄을 통해 작업자를 열고 매개변수를 통해 작업자가 처리해야 하는 대기열을 지정합니다.

  4. Worker는 데몬 프로세스로 실행되며 정기적으로 대기열을 확인합니다.

  5. 큐에 Job이 있으면 Worker는 Job을 꺼내 실행합니다. 즉, Job 클래스를 인스턴스화하고 클래스의 메서드를 실행합니다.

이제 백그라운드 작업을 완료할 수 있습니다.

Resque에는 또 다른 매우 중요한 설계가 있습니다. 작업자는 하나의 대기열 또는 여러 대기열을 처리할 수 있으며 작업자 프로세스/스레드 수를 늘려 대기열의 실행 속도를 가속화할 수 있습니다.

php-resque 설치

프로세스 개발 및 관리가 포함되기 때문에 php-resque는 php의 PCNTL 기능을 사용하기 때문에 Linux에서만 실행이 가능하며, 컴파일을 위해서는 php가 필요하다는 점 미리 알아두셔야 합니다. PCNTL 기능. Windows를 사용하여 동일한 작업을 수행하려는 경우 Resque의 다른 언어 버전을 찾을 수 있습니다. PHP는 Windows에서 백그라운드 작업에 매우 적합하지 않습니다.

Ubuntu12.04LTS를 예로 들어 보겠습니다. apt를 사용하여 Ubuntu에서 설치한 PHP는 기본적으로 아무런 구성 없이 PCNTL 기능을 컴파일했습니다. 다음 지침은 루트 계정 컴퓨터 교육 수업에 대한 것입니다.

Install Redis

apt-get install redis-server
로그인 후 복사

Install 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
로그인 후 복사

php-resque를 사용하여

Worker 작성

사실 php-resque에서는 데모/ job.php 파일은 가장 간단한 Job입니다:

class PHP_Job
{
    public function perform()
    {
        sleep(120);
        fwrite(STDOUT, 'Hello!');
    }
}
로그인 후 복사

이 Job은 120초 후에 Hello!라는 문자를 STDOUT으로 출력하는 것입니다!

Resque의 디자인에서 Job에는 실행 메소드가 있어야 하며 Worker는 자동으로 실행됩니다. 이 방법.

将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."\n\n";
로그인 후 복사

在这个例子中,queue.php需要以cli方式运行,将cli接收到的第一个参数作为Job名称,插入名为'default'的队列,同时向屏幕输出刚才插入队列的Job Id。在终端输入:

php demo/queue.php PHP_Job
로그인 후 복사

结果可以看到屏幕上输出:

Queued job b1f01038e5e833d24b46271a0e31f6d6
로그인 후 복사

即Job已经添加成功。注意这里的Job名称与我们编写的Job Class名称保持一致:PHP_Job

查看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还是等待状态。

运行Worker

这次我们直接编写demo/resque.php:

<?php
date_default_timezone_set('GMT');
require 'job.php';
require '../bin/resque';
로그인 후 복사

可以看到一个Worker至少需要两部分:

  1. 可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载

  2. 包含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
로그인 후 복사

可以看到有一个php的守护进程已经在运行了

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!

至此我们已经成功的完成了一个最简单的Resque实例的全部演示,更复杂的情况以及遗留的问题会在下一次的日志中说明。

相关推荐:

利用redis和php-resque实现后台任务 redis 下载 redis 集群 redis可视化工具

php网站设计 php-resque的设计和使用

php-resque消息队列的执行情况

위 내용은 php-resque 사용 지침의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!