프로젝트에서 백그라운드에서 작업을 실행해야 하는 경우가 종종 있습니다. 예를 들어 이메일을 보낼 때 사용자에게 성공적인 프롬프트 메시지를 보낼 수 있다면 메일 서버에 연결하는 데 5~10초 이상이 걸리는 경우가 많습니다. 먼저 이메일 전송 작업을 백그라운드에서 처리하면 분명히 더 나은 사용자 경험을 제공할 수 있습니다.
유사한 요구 사항을 충족하기 위해 웹 프로젝트의 일반적인 구현 방법은 모두 잘 알려진 제품인 MemcacheQ, RabbitMQ 등과 같은 메시지 큐(Message Queue)를 사용하는 것입니다.
직접 말하면 메시지 대기열은 가장 간단한 선입선출 대기열이며 대기열의 구성원은 텍스트 조각입니다. 정확하게는 메시지 대기열이 너무 간단하기 때문에 메시지 대기열을 보관할 때 약간 혼란스러워집니다. 이는 단지 이메일을 보내는 작업일 뿐이므로 많은 문제가 발생할 수 있기 때문입니다.
메시지 대기열은 문자만 저장할 수 있습니다. 문자열 형식의 데이터, 이메일 보내기 등의 "작업"을 메시지 큐에서 "메시지"로 변환하는 방법은 무엇입니까?
메시지 큐는 데이터 저장 및 입력만 담당하고 프로그램 자체를 실행할 수는 없습니다. , 그래서 우리는 메시지 큐에서 데이터를 하나씩 검색하고, 데이터를 다시 작업으로 변환하고 실행하는 방법을 알아야 합니다.
메시지 대기열이 언제 데이터를 생성할지 예측할 수 없으므로 작업 실행 프로그램에는 백그라운드에 상주하는 데몬 프로세스인 메시지 대기열을 모니터링하는 기능도 있어야 합니다.
일반 웹 애플리케이션 PHP는 cgi 모드에서 실행되며 메모리에 상주할 수 없습니다. PHP에도 CLI 모드가 있다는 것을 알고 있는데, PHP CLI를 사용하여 데몬 프로세스를 구현할 수 있으며 얼마나 효율적일까요?
데몬이 실행 중일 때 웹 애플리케이션이 백그라운드 데몬과 상호 작용하여 프로세스 시작/종료 기능을 실현하고 프로세스의 실행 상태를 얻을 수 있나요?
Resque는 이러한 문제를 다음과 같이 해결합니다.
실제로 하나의 메시지 대기열만으로는 모든 문제를 해결할 수 없으며 새로운 역할이 필요하다는 것을 위의 문제에서 볼 수 있습니다. 간섭. Resque에서는 백그라운드 작업이 세 가지 역할로 완료되도록 추상화됩니다.
Job | 작업: Job은 백그라운드에서 완료되어야 하는 작업입니다. 예를 들어 이 문서의 예로 이메일을 보낼 수 있습니다. Job으로 추상화됩니다. Resque에서 Job은 클래스입니다.
Queue: 위의 메시지 큐입니다. Resque에서 큐는 Redis에 의해 구현됩니다. Resque는 대기열에서 작업 삽입/제거와 같은 기능을 구현할 수 있는 간단한 대기열 관리자도 제공합니다.
Worker | Executor: 대기열에서 작업을 꺼내어 실행하는 역할을 하며 백그라운드에서 데몬 프로세스로 실행될 수 있습니다.
이 구분을 바탕으로 Resque에서 백그라운드 작업의 기본 프로세스는 다음과 같습니다.
백그라운드 작업을 독립 클래스로 작성하며 이 클래스가 Job입니다.
백그라운드 프로그램을 사용해야 하는 경우 시스템은 작업 클래스 이름과 필수 매개변수를 대기열에 넣습니다.
명령줄을 통해 작업자를 열고 매개변수를 통해 작업자가 처리해야 하는 대기열을 지정합니다.
Worker는 데몬 프로세스로 실행되며 정기적으로 대기열을 확인합니다.
큐에 Job이 있으면 Worker는 Job을 꺼내 실행합니다. 즉, Job 클래스를 인스턴스화하고 클래스의 메서드를 실행합니다.
이제 백그라운드 작업을 완료할 수 있습니다.
Resque에는 또 다른 매우 중요한 설계가 있습니다. 작업자는 하나의 대기열 또는 여러 대기열을 처리할 수 있으며 작업자 프로세스/스레드 수를 늘려 대기열의 실행 속도를 가속화할 수 있습니다.
프로세스 개발 및 관리가 포함되기 때문에 php-resque는 php의 PCNTL 기능을 사용하기 때문에 Linux에서만 실행이 가능하며, 컴파일을 위해서는 php가 필요하다는 점 미리 알아두셔야 합니다. PCNTL 기능. Windows를 사용하여 동일한 작업을 수행하려는 경우 Resque의 다른 언어 버전을 찾을 수 있습니다. PHP는 Windows에서 백그라운드 작업에 매우 적합하지 않습니다.
Ubuntu12.04LTS를 예로 들어 보겠습니다. apt를 사용하여 Ubuntu에서 설치한 PHP는 기본적으로 아무런 구성 없이 PCNTL 기능을 컴파일했습니다. 다음 지침은 루트 계정 컴퓨터 교육 수업에 대한 것입니다.
apt-get install redis-server
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'
웹 디렉토리가 /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에서는 데모/ job.php 파일은 가장 간단한 Job입니다:
class PHP_Job { public function perform() { sleep(120); fwrite(STDOUT, 'Hello!'); } }
이 Job은 120초 후에 Hello!라는 문자를 STDOUT으로 출력하는 것입니다!
Resque의 디자인에서 Job에는 실행 메소드가 있어야 하며 Worker는 자동으로 실행됩니다. 이 방법.
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
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还是等待状态。
这次我们直接编写demo/resque.php:
<?php date_default_timezone_set('GMT'); require 'job.php'; require '../bin/resque';
可以看到一个Worker至少需要两部分:
可以直接包含Job类文件,也可以使用php的自动加载机制,指定好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
可以看到有一个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-resque 사용 지침의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!