josegonzalez / cakephp-cake-djjob
基于 seatgeek 的 djjob 的 cakephp 任务队列 — 编辑
Requires
This package is not auto-updated.
Last update: 2020-01-24 16:02:00 UTC
README
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 库
安装
您需要安装 djjob
和 cake_djjob
。注意,您需要一个与 djjob
中包含的相同的 jobs
表。一个 cake_schema
文件即将推出。
DJJob 安装
[手动]
- 下载此内容: http://github.com/seatgeek/djjob/zipball/master
- 解压下载内容。
- 将得到的文件夹复制到 app/plugins
- 将您刚刚复制的文件夹重命名为
Djjob/Vendor
[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 安装
[手动]
- 下载此内容: http://github.com/josegonzalez/cake_djjob/zipball/master
- 解压下载内容。
- 将得到的文件夹复制到 app/Plugin
- 将您刚刚复制的文件夹重命名为
CakeDjjob
[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
此任务可以接受 connection
、type
、queue
和 debug
参数,以及一些自定义参数
- --action ** 清理任务要执行的操作。默认值:null
- --date ** 日期偏移。默认值:当前日期的 'Y-m-d H:i:s' 格式
- --save ** 允许清理以修改数据库。默认值:1
获取作业队列的状态
如果您需要获取特定作业队列的状态,可以在任务上调用状态方法
cake worker status
此任务还可以接受 connection
、type
、queue
和 debug
参数。
待办事项
- 允许使用替代方法进行插件前缀
- 通过自定义序列化方法绕过类加载
- 配置作业类位置
- 屏幕截图
- 单元测试
- 更多文档(DeferredEmail 类)
- - 任务:允许从shell创建作业
许可
版权(c)2011 Jose Diaz-Gonzalez
在此,任何人免费获得本软件及其相关文档副本(“软件”),无限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供的人这样做,但需遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“现状”提供,不提供任何形式的保证,无论是明示的还是隐含的,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论此类责任是基于合同、侵权或其他法律依据,源于、因之或与此软件或其使用或其他交易有关。