josegonzalez/cakephp-cake-djjob

此包已被废弃且不再维护。未建议替代包。

基于 seatgeek 的 djjob 的 cakephp 任务队列 — 编辑

dev-master 2015-11-29 12:21 UTC

This package is not auto-updated.

Last update: 2020-01-24 16:02:00 UTC


README

Build Status Coverage Status Total Downloads Latest Stable Version Documentation Status Gratipay

Cake DJJob 插件

快速便捷的任务队列,基于 delayed_job

背景

CakePackages 是适合使用后台进程的网站类型。与其试图构建并失败一个任务/工作系统,我决定包装一个现有的系统。

我了解一些 cakephp 的插件,特别是 David Persson 的 queue 插件和 Pierre-Emmanuel Fringant 的 cron-mailer 插件。然而,我不愿运行和维护另一个服务,我的 cron 任务根本不是基于电子邮件的。另外,David 的插件缺少文档,我不愿意一次性熟悉这么多工具。

SeatGeek,我们使用 PHP 端口delayed_job,在生产环境中表现良好。它是一组小巧的类,可以抽象掉创建新任务和工作的大部分痛苦。不幸的是,我唯一使用过它的系统是 Symfony(您会注意到我们包含了包中的示例 Symfony 任务)。

所以这就是 Cake DJJob。使用它并在必要时滥用它来创建任务/工作:)

要求

  • CakePHP 1.3
  • 耐心
  • PHP 5
  • PDO(PHP >= 5.1 包含在内)
  • (可选)PCNTL 库

安装

您需要安装 djjobcake_djjob。注意,您需要一个与 djjob 中包含的相同的 jobs 表。一个 cake_schema 文件即将推出。

DJJob 安装

[手动]

[GIT 子模块]

在您的 app 目录中输入

git submodule add git://github.com/seatgeek/djjob.git Plugin/Djjob/Vendor
git submodule init
git submodule update

[GIT Clone]

在您的插件目录中输入

git clone git://github.com/seatgeek/djjob.git Djjob/Vendor

3. Cake DJJob 安装

[手动]

[GIT 子模块]

在您的 app 目录中输入

git submodule add git://github.com/josegonzalez/cake_djjob.git Plugin/CakeDjjob
git submodule init
git submodule update

[GIT Clone]

在您的 Plugin 目录中输入

git clone git://github.com/josegonzalez/cake_djjob.git CakeDjjob

使用

创建新任务

您可以在应用程序或任何插件的 Lib/Job 文件夹中创建新的任务。当创建插件任务时,插件名称必须出现在任务类名中,而不是任务类文件中。例如,CakeDjjob 插件在 Lib/Job/TestJob.php 中包含 CakeDjjob_TestJob。所有插件都必须使用下划线与任务类名分离,并且类名中只能有一个下划线。这样可以同时使用插件和应用中的任务。

任务响应于 perform() 方法,如 djjob 一样。在 CakeDjjob 中,所有任务都应该扩展 CakeJob 类。这不是必需的,但它可以使您的工作任务具有更多的基本功能。例如,一个应用程序的 ForgotPasswordJob 可能如下所示

<?php
class ForgotPasswordJob extends CakeJob {

    var $email = null;
    function __construct($email) {
        $this->email = $email;
    }

    function perform() {
        $this->out('Some debug output');

        // Using models
        $this->loadModel('User');
        $user = $this->User->findByEmail($this->email);

        if (empty($user)) {
            return;
        }

        // Complex email stuff here...
        $this->loadComponent('Email');
        $this->Email->_set(array(
            'to' => $this->email,
            'from' => 'noreply@example.com',
            'subject' => 'Forgot your password?',
            'replyTo' => 'noreply@example.com',
            'template' => null,
            'sendAs' => 'both',
        ));
        $this->Email->send("Some text to indicate how to reset password...");
    }

}
?>

扩展 @CakeJob@ 还允许使用以下方法

  • @loadModel($modelClass, $id = null)@ ** 与 Controller::loadModel() 的行为完全相同
  • @loadComponent($componentClass)@ ** 加载、初始化并附加一个组件
  • @out($message = null, $newlines = 1)@ ** 向标准输出输出消息
  • @err($message = null, $newlines = 1)@ ** 向标准错误输出错误消息
  • @nl($multiplier = 1, $print = false)@ ** 向标准输出输出换行符
  • @hr($newlines = 0)@ ** 向标准输出输出水平线

通过扩展 @CakeJob@,您将立即获得一个基础,从而可以快速轻松地编写任务。

队列任务

您可以将 @CakeDjjob@ 组件以如下方式附加到控制器上

<?php
App::uses('ForgotPasswordJob', 'Lib/Job');

class UsersController extends AppController {
    public $components = array('CakeDjjob.CakeDjjob');

    public function forgot_password() {
        if (($email = $this->User->forgot($this->data)) != false) {
            $this->CakeDjjob->enqueue(new ForgotPasswordJob($email));
            $this->Session->setFlash('You will shortly be sent a password reset email :)');
        } else {
            $this->Session->setFlash('There is no such email in our system. Please try again.');
        }
    }

}
?>

还可以通过附加包含的 @CakeDjjob@ 行为从模型中排队任务

<?php
App::uses('ForgotPasswordJob', 'Lib/Job');

class User extends AppModel {
    public $actsAs = array('CakeDjjob.CakeDjjob');

    public function forgot_password($email) {
        return $this->enqueue(new ForgotPasswordJob($email));
    }

    public function bulkAction($emails = array(), $config = array()) {
        $jobs = array();
        foreach ($emails as $email) {
            $jobs[] = new BulkPasswordResetJob($email, $config);
        }

        return $this->bulkEnqueue($jobs);
    }
}
?>

将任务加载到对象中的可选方法

  • 需要 (PHP 5 >= 5.1.3) 和 ReflectionClass 在使用参数加载任务时
  • 这是使用 App::uses() 手动导入任务的一种替代方法。
  • load 函数仅要求第一个参数是要加载的任务名称。
    • 它假设任务将来自 /app/Lib/Job
    • 您可以传递所需的所有参数,因为它们只是传递到您的任务中
<?php
class User extends AppModel {
    public $actsAs = array('CakeDjjob.CakeDjjob');

    public function forgot_password($email) {
        return $this->enqueue($this->CakeDjjob->load('ForgotPasswordJob', $email));
    }

    public function bulkAction($emails = array(), $config = array()) {
        $jobs = array();
        foreach ($emails as $email)
            $jobs[] = $this->CakeDjjob->load('BulkPasswordResetJob', $email, $config);
        }

        return $this->bulkEnqueue($jobs);
    }
}
?>

运行任务

此插件包含一个运行任务的作业。

cake worker run

上面的语句将永久运行默认队列上的单个工作者。它可以添加到 cron 或其他进程管理器(如 God)中。工作者有以下可用参数

  • --connection ** 设置数据库配置。默认配置:default
  • --type ** 连接的 pdo 名称。默认类型:mysql
  • --queue ** 从中拉取任务的队列。默认队列:default
  • --count ** 运行任务之前退出。默认计数:0
  • --sleep ** 在找到新任务之前暂停的秒数。默认秒数:5
  • --max ** 给定任务的尝试次数。默认重试:5
  • --debug ** 为工作者设置调试。默认级别:0

清理作业队列

可以通过重置已锁定任务或删除失败任务来清理特定的作业队列。

cake worker cleanup

此任务可以接受 connectiontypequeuedebug 参数,以及一些自定义参数

  • --action ** 清理任务要执行的操作。默认值:null
  • --date ** 日期偏移。默认值:当前日期的 'Y-m-d H:i:s' 格式
  • --save ** 允许清理以修改数据库。默认值:1

获取作业队列的状态

如果您需要获取特定作业队列的状态,可以在任务上调用状态方法

cake worker status

此任务还可以接受 connectiontypequeuedebug 参数。

待办事项

  • 允许使用替代方法进行插件前缀
  • 通过自定义序列化方法绕过类加载
  • 配置作业类位置
  • 屏幕截图
  • 单元测试
  • 更多文档(DeferredEmail 类)
  • - 任务:允许从shell创建作业

许可

版权(c)2011 Jose Diaz-Gonzalez

在此,任何人免费获得本软件及其相关文档副本(“软件”),无限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供的人这样做,但需遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“现状”提供,不提供任何形式的保证,无论是明示的还是隐含的,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论此类责任是基于合同、侵权或其他法律依据,源于、因之或与此软件或其使用或其他交易有关。