2012-07-06 49 views
17

我希望我的客戶端(通過post)發送的數據放入隊列中,並且我的服務器上的php腳本首先檢查隊列是否爲空。如果隊列不是空的,那麼腳本應該逐個處理隊列中的所有數據。我該怎麼做?PHP我如何在php中實現隊列處理

+0

在數據庫中創建一個表來提交數據,然後運行crontab作業x來檢索它? – BugFinder 2012-07-06 06:50:51

+0

是的。我喜歡這種方法。但是在將任務插入表中後,如何檢索要完成的任務並在任務完成時更新表? – ASHUTOSH 2012-07-06 10:20:30

+0

這是cronjob運行任務來處理,訪問數據庫並更新它的要點 – BugFinder 2012-07-06 10:40:22

回答

1

cronjob方法的問題是,cronjob最多可以設置爲1分鐘的間隔,所以在作業執行時會有1分鐘的延遲,如果這是可以接受的,那很好,否則應該使用輪詢腳本使用隊列。

0

由於關係數據庫(例如:MySQL)非常靈活,並且被Web開發人員理解,所以它們被用於許多類型的作業隊列。當對象緩存未配置時,許多PHP應用程序將此解決方案用作回退。這是最後的方法,因爲這是實現隊列的非常昂貴的方式。

如果您必須使用MySQL作爲您的隊列,Percona的工程師之一編寫了這個blog entry來管理潛在的痛點。

如果你想要最具擴展性的實現,我會強烈推薦ZeroMQ。但它不是默認的,或者特別常見的PHP擴展。因此,對於一個不會控制Web服務器堆棧的項目:使用APC對象,Memcache或Memcached,然後回退到MySQL緩存表。

4

這是你可以輕鬆地用enqueue圖書館做的事情。首先,您可以從各種transports中進行選擇,例如AMQP,STOMP,Redis,Amazon SQS,Filesystem等。其次,這是超級簡單易用的。我們從安裝開始:

您必須安裝enqueue/simple-client庫和one of the transports。假定您選擇文件系統,請安裝enqueue/fs庫。總結:

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 

$client->sendEvent('a_topic', 'aMessageData'); 

消費腳本:

<?php 
// consumer.php 

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

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

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

$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) { 
    // processing 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(); 

運行儘可能多的consumer.php過程,你使用supervisord或其他進程管理器,您可以在本地計算機上運行它,而無需任何額外的庫或包。

這是一個基本的例子,排隊有很多其他功能可能派上用場。如果您有興趣,請查看enqueue documentation