我是使用隊列進行密集進程的新手。我有一個應用程序,可以上傳短視頻,使用FFMPEG處理它,然後使用API上傳到YouTube,然後與我的數據庫進行交互。我的問題:PHP隊列實現
我應該使用兩個不同的隊列嗎?一個處理,然後把它交給不同的隊列上傳?或者我應該把所有的處理放在一個工人身上?
可以從工作人員與數據庫進行交互還是應該以其他方式進行操作?
我是使用隊列進行密集進程的新手。我有一個應用程序,可以上傳短視頻,使用FFMPEG處理它,然後使用API上傳到YouTube,然後與我的數據庫進行交互。我的問題:PHP隊列實現
我應該使用兩個不同的隊列嗎?一個處理,然後把它交給不同的隊列上傳?或者我應該把所有的處理放在一個工人身上?
可以從工作人員與數據庫進行交互還是應該以其他方式進行操作?
我建議使用兩個不同的隊列,一個用於圖像處理,另一個用於將其上傳到YouTube。從隊列中查詢數據庫是完全可以的,儘管您可能會在消息中傳遞所有必需的數據,因此您不需要數據庫。
下面介紹如何使用enqueue庫來實現類似的功能。
您必須安裝enqueue/simple-client
庫和one of the transports。假設你選擇了文件系統的,所以讓我們來安裝它:
composer require enqueue/simple-client enqueue/fs
現在讓我們看看如何從您的文章腳本發送消息:
<?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。
使用2個不同的隊列來處理不同的事情可能會更好。如果你在一個過程中做所有事情,那麼完成所有事情可能需要很長時間。如果你使用2個不同的流程,那麼它將能夠在更短的時間內分配工作並完成整個事情 – Virendra 2015-03-02 16:25:32