我面对的是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后面的 Controller 操作不会显示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秒才能完成。
  • 最佳答案

    两个示例都可以正常工作。如果sleep(11)不起作用,则可能是由于并发而产生副作用。 FlashMessenger基于 session ,因此您必须检查 session 配置。重定向器 Action 帮助程序$this->_redirect();将发送 header 并创建一个新的HTTP请求,以产生一个新的整个调度过程。因此,您还必须检查已注册到此过程的插件(解释为here)。

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

    顺便说一句,使用sleep来模拟“打印作业已完成”是一种不好的做法。您应该更喜欢另一条消息,例如“将Printjob添加到队列中”,这不是一个谎言,它是用户友好的。

    关于php - 长时间请求后添加消息时,flashMessenger无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22714452/

    10-10 04:44