2013-07-31 58 views
1

也許任何人都知道如何最好地解決這個問題。ZF2觸發服務或後臺事件

我有一個客戶端可以上傳文件的ZF2應用程序。該文件包含訂單,然後需要處理。如果我觸發一個立即開始處理該文件的事件,則客戶端無法繼續(執行其他操作)。所以我想在開始處理這個文件的背景中觸發一個事件,而我的操作會將下一頁返回給我的客戶端,以便他或她可以繼續填寫其他內容。現在我當然可以用cron工作來解決這個問題......但是現在還有另外一種方式可以讓ZF2提供更多的事件驅動? 是否有可能觸發後臺事件(或服務),像這樣:

public function csvUploadAction() 
{ 
    $id = (int) $this->params()->fromRoute('id', 0); 

    $form = new CsvForm($id); 
    // do some validating and stuff... 

    if ($form->isValid()) { 
    // more stuff.. 

    $this->getEventManager()->trigger('readCsvInBackground', $this, $parameters); 
     return $this->redirect()->toRoute('publications', array(
         'action' => 'edit', 'id' => $id 
        )); 
// etc.. 
} 

我已經角落找尋搜索這樣的解決方案,但無法找到任何(其他然後使用cron作業)。任何人有個想法? 非常感謝您的時間!

回答

1

您應該看看jobqueue解決方案。總的想法是,你只需在包含csv(base64編碼)的隊列中放置消息/作業,或者將csv寫入磁盤並在消息中傳遞路徑。您可以將消息發送到隊列(這是非常輕量級的操作),並直接向用戶返回響應。

接下來,您必須編寫一個從隊列中接收消息並按FIFO順序處理它們的工作程序。如果這項工作非常繁重,而且您的等待工作不斷積累,您可以添加更多的工作人員,以便將工作分配給許多工作人員(這稱爲扇出)。

一些開源的解決方案,有一個PHP客戶端API,併爲您的使用情況下,工作帶來極大的有:

+0

謝謝布拉姆,這是我沒有想到的解決方案!我要去找Gearman。非常感謝你的建議:-) – Isolde

2

布拉姆是正確的,你想有一個工作隊列。

您可能會看到SlmQueue,它是一個ZF2模塊,它是一個隊列抽象層(目前有Beanstalkd,Amazon SQS和DoctrineORM的後端),如果不使用它,至少對於一些啓發。我正在使用beanstalkd,結果很好。

您當然可以簡化並直接使用beanstalkd,可能通過Pheanstalk客戶端庫for PHP。