我正面临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秒才能完成。答案 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文件中的消息。