在长请求后添加Message时flashMessenger无法正常工作

时间:2014-03-28 13:37:17

标签: php zend-framework php-5.4

我正面临Zend Frameworks flashMessenger的一个非常奇怪的问题,无法找出问题的原因,也不知道如何解决问题。

当请求的操作需要很长时间时,flashMessenger无法按预期工作。

非工作示例:

class AttachmentController extends Zend_Controller_Action {

    public function printAction() {
        // action takes really long and causes flash message to not appear at all
        sleep(11);

        $this->_helper->flashMessenger
            ->setNamespace('success')
            ->addMessage("It's done!");

        $this->_redirect('/attachment/index');
    }
}

使用上面的代码,/attachment/index后面的控制器操作不会显示flashMessage。

但是,如果我减少脚本的运行时间,它可以工作:

class AttachmentController extends Zend_Controller_Action {

    public function printAction() {
        // now the action runs faster and the flashMessage appears!
        sleep(1);

        $this->_helper->flashMessenger
            ->setNamespace('success')
            ->addMessage("It's done!");

        $this->_redirect('/attachment/index');
    }
}

问题: flashMessenger可能导致我的消息不显示的原因是什么?我该如何解决?

注意:

  • 是的,我确定这是问题所在。我在生产代码中插入了sleep(11),它产生了所描述的行为。问题是由我为替换案例而替换的代码引起的。这真的是由脚本的长运行时间引起的。
  • 我无法让脚本执行得更快。而不是示例中的sleep(11),在生产代码中将某些内容发送到打印机,需要大约11秒才能完成。

2 个答案:

答案 0 :(得分:3)

这两个例子都很好。如果sleep(11)不起作用,则会产生副作用,可能是并发性的。 FlashMessenger是基于会话的,因此您必须检查会话配置。重定向器操作助手$this->_redirect();将发送标头并创建新的HTTP请求以生成新的整个调度过程。因此,您还必须检查已注册到此过程的插件(解释here)。

要解决此问题,您可以尝试使用转发器而不是重定向器。非常好解释了here(重定向和转发之间的差异)和here(使用-flashmessenger-without-redirect)。

顺便说一句,使用sleep模拟“printjob完成”是不好的做法。您应该更喜欢另一条消息,例如“Printjob添加到队列中”,这不是谎言,而且用户友好。

答案 1 :(得分:-1)

我认为你应该玩js而不是php。

sleep()只需停止执行指定的秒数即可。

当您使用sleep(1)sleep(11)时,两者都会提供相同的输出。

我认为您正在使用下面给出的代码调度一些文件。

$this->_redirect('/attachment/index');

您应该发送一条特殊消息(要识别在11秒后加载)未在其他消息中使用,并且您应该在11秒后写入要执行的js(暂时隐藏消息并在11秒后显示)该消息正在收到in.phtml文件中的消息。