我面对的是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/