设置和使用php-resque的正确方法是什么?

问题描述:

我正尝试使用php-resque排队并在我的服务器上执行ffmpeg转换。我大致了解它应该如何工作,但我在细节方面遇到了一些麻烦,找不到任何教程。具体而言,我不明白我应该在哪里放置工作班,以及如何将班授予我的工人并启动我的工人。阅读我只说“让你的应用程序正在进行还包括通过自动加载器或包括他们告诉工人你的工作班。”设置和使用php-resque的正确方法是什么?

希望有人可以概述使用php-resque的整体结构。

你可以把你的工作班放在你想要的地方。这取决于你的应用程序结构。

如何创建一个作业类

例如,假设类VideoConversion,用于ffmpeg的转换。

class VideoConversion { 

    public function perform() { 
     // The code for video conversion here 
    } 

} 

在主应用程序,使用PHP-resque之前,让我们假设你有类似的东西

public function uploadVideo() { 
    // Upload and move the video to a temp folder 
    // Convert the video 
} 

而且要排队的“转换视频”部分。让我们只是将其排入到convert队列:

public function uploadVideo() { 
    // Upload and move the video to a temp folder 
    // Let's suppose you need to convert a 'source video' to a 'destination video' 
    Resque::enqueue('convert', 'VideoConversion', array('origine-video.avi', 'destination-video.avi')); 
} 

当排队的工作,我们所经历的路径的源和目标视频对VideoConversion类。您可以传递其他参数,这取决于您的VideoConversion类如何编写。

工作人员将轮询convert队列,并执行VideoConversion作业。工作人员会做的是实例化VideoConversion类,并执行perform()方法。

的作业参数(array('origine-video.avi', 'destination-video.avi')),排队与Resque::enqueue作业时第三个参数,将通过$this->args可用的perform()方法内。

# VideoConversion.php 
class VideoConversion 
{ 
    public function perform() { 
    // $this->args == array('origine-video.avi', 'destination-video.avi'); 
    // Convert the video 
} 

找到你的作业类

VideoConversion类可以放在任何地方,但是你必须告诉你的员工在哪里可以找到它。 有多种方法可以做到这一点在include_path

在你的.htaccess或者Apache的配置

把你的作业类,添加包含所有作业类的包括路径中。你的工作人员会自动找到它们。

此方法的主要问题是所有作业类都必须位于同一文件夹中,并且所有作业类都可在任何地方使用。

告诉每个工人在哪里可以找到你的作业类

当启动工人,使用APP_INCLUDE参数指向就业班“自动加载”。

APP_INCLUDE=/path/to/autoloader.php QUEUE=convert php resque.php 

上述命令将启动一个新的worker,轮询名为convert的队列。 我们还将文件/path/to/autoloader.php传递给工作人员。 (see here to learn to start a worker

从技术上讲,工作人员将包括该文件include '/path/to/autoloader.php';

您可以再告诉工人们如何找到你的工作类:

使用基本包括

在 '/path/to/autoloader.php':

include /path/to/VideoConversion.php 
include /path/to/anotherClass.php 
... 

使用自动加载器

使用php自动加载器加载您的工作类。

使用set_include_path()

set_include_path('path/to/job'); 

这样一来,你的工作是在include_path只为这名工人。

截止认为

APP_INCLUDE被绑定到你开始的工人。如果您要开始另一名工人,请再次使用APP_INCLUDE。您可以为每个工作人员使用不同的文件。

您还可以设计您的工作类来执行多个工作。有一个tutorial解释如何做到这一点。它涵盖了从队列系统的基础到如何使用和实施它。

如果还不够,请查看resque文档。 php-resque API完全一样。唯一不同的是,Resque作业类是用Ruby编写的,而php-resque则是用php编写的。

+0

嗨Kamisama, 我通过你的博客文章相关的背景工作,他们是优秀的。 我在Windows7上遵循相同的步骤。工作正常排队。我可以从Redis控制台看到它。但是当我运行Resque命令时,作业会弹出(Redis控制台中的计数会下降),但作业是空的。我通过将fwrite放入实际的PHP-Resque库中来检查这一点。 Resque.php类的pop方法正在取物品($ item),但它总是空的。 任何想法可能是错误的?这是否与Windows操作系统有关? 谢谢。 – 2013-06-01 06:56:49

+0

那么Redis pop命令总是返回null?检查cli模式下的php配置是否正确,以使用redis。 – Wa0x6e 2013-06-03 19:34:48

+0

@Kamisama thx为你有用的教程系列。如何让resque worker只为一个给定的队列同时处理一个作业? – 2014-07-24 20:53:54

嗨请查看下面的教程,了解如何在phalcon中使用resque。 http://www.mehuldoshi.in/background-jobs-phalcon-resque/