【问题标题】:flashMessenger not working when adding Message after a long request长时间请求后添加消息时,flashMessenger 无法正常工作
【发布时间】:2014-05-08 00:15:13
【问题描述】:

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 秒才能完成。

【问题讨论】:

  • 任何想法表示赞赏!
  • flashMessenger 中有什么内容? addMessage 是做什么的?写入数据库或会话? var_dump()exit 是你的朋友 =) 我在 FlashMessenger 中找不到 addMessage()
  • 我对您的 ZF2 API 参考和 ZF2 标签感到困惑。你的代码看起来像 ZF1!
  • FlashMessenger 是基于会话的,请检查您的会话配置。我敢打赌这两个例子都很好。添加后请转储消息容器,您将看到两个示例都可以正常工作
  • @Mamuz 我明天会测试这个。我还假设在两种情况下添加消息后都会出现在容器中。问题是它没有显示在下一页上,好像该消息已过期以等待更长的运行请求

标签: php zend-framework php-5.4


【解决方案1】:

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

要解决此问题,您可以尝试使用转发器而不是重定向器。真的很好解释了here (difference-between-redirect-and-forward) 和 here (use-flashmessenger-without-redirect)。

顺便说一句,使用sleep 模拟“打印作业完成”是一种不好的做法。您应该更喜欢另一条消息,例如“Printjob added to queue”,这不是谎言,而且是用户友好的。

【讨论】:

  • 好建议,如果转发而不是重定向对 flashMessenger 有影响,我会尝试。关于您的排队建议:这很有趣,因为我不得不用实际的打印逻辑替换“添加到队列”(这显然需要更长的时间)。 sleep(1) 是将作业放入队列(几乎立即返回)的模型,sleep(11) 是真实打印逻辑的模型。它在打印作业完成后返回,这需要一段时间。如果打印成功与否,应该显示 flashMessenger()。 (即连接打印机时的套接字超时)
  • 当转发而不是重定向消息时出现。我们现在在应用程序中转发作为一种解决方法。我仍在寻找重定向问题的原因,我想解决这个问题。 (转发与重定向不同,我希望用户看到正确的 URL,这是转发无法做到的)。我会将赏金奖励给显示真正问题的答案。
【解决方案2】:

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

sleep() 只需停止执行给定的秒数。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2020-08-08
    • 2018-07-13
    相关资源
    最近更新 更多