当前位置: 首页 > 工具软件 > Php-Resque > 使用案例 >

php-resque实践应用教程

孟跃
2023-12-01

PHP-Resque是现成的框架,基於 Redis 开发消息队列系统,消息队列服务要求比较轻量级,用于创建后台作业,将这些作业放在多个队列中,并在稍后处理它们。发短信,发邮件,执行不那么着急的数据库操作等等,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。

第一章 准备

php-resque类包下载

1、composer下载

新建composer.json,内容如下


    {
         “ require ”:{
             “ chrisboulton / php-resque ”:“ 1.2 ”
            }
    }

运行composer install。

2、git下载地址:https://github.com/chrisboulton/php-resque.git

执行 git clone https://github.com/chrisboulton/php-resque.git

3、手动zip下载地址:https://api.github.com/repos/chrisboulton/php-resque/zipball/0549d6c88a4aed934655b7c03b6153349d6c3ad0

要求

PHP 5.3+
Redis 2.2+

第二章 简介

php-resque的设计

在Resque中,一个后台任务被抽象为由三种角色共同完成:

  • Job | 任务 : 一个Job就是一个需要在后台完成的任务,比如本文举例的发送邮件,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
  • Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
  • Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台。
    那么基于这个划分,一个后台任务在Resque下的基本流程是这样的:

在Resque中,有一个很重要的设计:一个Worker,可以处理一个队列,也可以处理很多个队列,并且可以通过增加Worker的进程/线程数来加快队列的执行速度。

流程如下:

  • 将一个后台任务编写为一个独立的Class,这个Class就是一个Job。
  • 在需要使用后台程序的地方,系统将Job Class的名称以及所需参数放入队列。
  • 以命令行方式开启一个Worker,并通过参数指定Worker所需要处理的队列。
  • Worker作为守护进程运行,并且定时检查队列。
  • 当队列中有Job时,Worker取出Job并运行,即实例化Job Class并执行Class中的方法。

第三章 php-resque的使用

编写一个Worker(后续业务处理)

class PHP_Job
{
    public function perform()
    {
        sleep(120);
        fwrite(STDOUT, 'Hello!');
    }
}

在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法

将Job插入队列

php queue.php PHP_Job

    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";

查看Job运行情况

php check_status.php b1f01038e5e833d24b46271a0e31f6d6

我们刚才创建的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

QUEUE=default php resque.php

参数:VVERBOSE=1 查看work工作状态

总结一下Redis中的key对应的内容及其含义如下:

resque:workers (set) - 存放所有的worker,每一个值都是{worker host}:{进程ID}:{queue的名称}
resque:queues (set) - 存放所有queue的名称
resque:queue:default (list) - 保存这个队列中等待执行的Job
resque:job:52f5abf5344094efc417e7ea8f1aa083:status (string) - 存放job的状态信息
resque:stat:processed (string) - 保存所有worker执行job成功的个数
resque:stat:processed:jun-Ubuntu:25122:* (string) - 保存一个worker执行job成功的个数
resque:worker:jun-Ubuntu:25122:*:started (string) - 保存一个worker的启动时间
resque:worker:jun-Ubuntu:25122:* (string) - 保存一个worker当前执行的Job的所有信息

php-resque使用参考传送门有:

redis重起:redis-cli -h 127.0.0.1 -p 6379 shutdown

 类似资料: