ZF2在后台触发服务或事件

时间:2013-07-31 09:15:45

标签: zend-framework2 background-process event-triggers

也许有人知道如何最好地解决这个问题。

我有一个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..
}

我已经搜索过arround这样的解决方案,但找不到任何东西(其他的则使用cron作业)。有人有想法吗? 非常感谢你的时间!

2 个答案:

答案 0 :(得分:2)

Bram是正确的,你想要一个工作队列。

你可能会看一下SlmQueue,这是一个ZF2模块,它是一个队列抽象层(目前有Beanstalkd,Amazon SQS和DoctrineORM的后端),如果不使用它,至少是为了一些灵感。我正在使用beanstalkd,效果很好。

当然,您可以简化并直接使用beanstalkd,可能通过PHP的Pheanstalk客户端库。

答案 1 :(得分:1)

您应该了解一个职业队列解决方案。一般的想法是,您只需将消息/作业放入包含csv(base64编码)的队列中,或将csv写入磁盘并传递消息中的路径。您只需将消息发送到队列(这是非常轻量级的操作)并直接向用户返回响应。

接下来,您必须编写一个从队列中获取消息并按FIFO顺序处理它们的工作程序。如果这项工作非常繁重并且您的等待工作不断累积,您可以增加更多工人,因此工作分配给许多工人(这称为扇出)。

一些开源解决方案具有PHP客户端api并且非常适合您的用例: