PHP队列实现

时间:2015-03-02 16:22:59

标签: php ffmpeg queue

我对使用队列进行密集型处理感到陌生。我有一个应用程序,它将上传一个短视频,使用FFMPEG处理它,然后使用他们的API上传到youtube,然后与我的数据库进行交互。我的问题:

我应该使用两个不同的队列吗?一个要处理,然后将其交给另一个队列上传?或者我应该将所有处理工作放在一个工人身上吗?

是否可以与工作人员进行数据库交互,还是应该以其他方式执行此操作?

1 个答案:

答案 0 :(得分:0)

我建议使用两个不同的队列,一个用于图像处理,另一个用于将其上传到youtube。从队列工作者查询数据库是完全可以的,尽管您可以传递消息中的所有必需数据,因此您不需要数据库。

以下是使用enqueue库实现此类功能的方法。

您必须安装enqueue/simple-client库和one of the transports。假设你选择了一个文件系统,那么让我们安装它:

composer require enqueue/simple-client enqueue/fs 

现在让我们看看如何从POST脚本发送消息:

<?php
// producer.php

use Enqueue\SimpleClient\SimpleClient;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://'); // the queue will store messages in tmp folder

// you uploaded the file to your server,
// and now you have a path to the file.
// I assume it is in the $movieFile var.

$client->sendCommand('process_movie', $movieFile);

消费脚本:

<?php
// consumer.php

use Enqueue\Client\Config;
use Enqueue\SimpleClient\SimpleClient;
use Enqueue\Psr\PsrProcessor;
use Enqueue\Psr\PsrMessage;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://');

$client->bind(Config::COMMAND_TOPIC, 'process_movie',  function(PsrMessage $psrMessage) use ($client) {
   $movieFile = $psrMessage->getBody();

   // a movie processing logic here

   // once we have done with processing we can send a message to upload_movie queue.

   $client->sendCommand('upload_movie', $movieFile);

   return PsrProcessor::ACK;
});

$client->bind(Config::COMMAND_TOPIC, 'upload_movie', function(PsrMessage $psrMessage) {
   $movieFile = $psrMessage->getBody();

   // a movie uploading logic here

   return PsrProcessor::ACK;
});

// this call is optional but it worth to mention it.
// it configures a broker, for example it can create queues and excanges on RabbitMQ side. 
$client->setupBroker();

$client->consume();

使用supervisord或其他进程管理器运行尽可能多的consumer.php进程,在本地计算机上运行它,无需任何额外的库或包。

这是一个基本的例子,入队有许多其他可能派上用场的功能。如果您有兴趣,请查看enqueue documentation