1

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

我有一个 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 作业)。有人有想法吗?非常感谢您的宝贵时间!

4

2 回答 2

2

布拉姆是正确的,你想要一个工作队列。

你可能会看一下SlmQueue,它是一个 ZF2 模块,它是一个队列抽象层(目前有 Beanstalkd、Amazon SQS 和 DoctrineORM 的后端),如果不使用它,至少可以获得一些灵感。我将它与beantalkd一起使用,效果很好。

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

于 2013-07-31T22:25:37.173 回答
1

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

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

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

于 2013-07-31T09:52:31.747 回答