【问题标题】:Disable output buffering in Zend_View在 Zend_View 中禁用输出缓冲
【发布时间】:2011-01-26 02:31:28
【问题描述】:

我早就料到了

类 Default_Plugin_Test 扩展 Zend_Controller_Plugin_Abstract { 公共函数 preDispatch($request) { Zend_Controller_Front::getInstance()->setParam('disableOutputBuffering', true); } }

还会禁用与操作关联的视图中的缓冲,但不会。

即使在视图中禁用输出缓冲似乎也是不可能的,因为它是硬编码的:

抽象类 Zend_View_Abstract 实现 Zend_View_Interface { /** * 处理视图脚本并返回输出。 * * @param string $name 要处理的脚本名称。 * @return string 脚本输出。 */ 公共函数渲染($名称) { // 使用父私有方法查找脚本文件名 $this->_file = $this->_script($name); 未设置($名称); // 从本地范围中删除 $name ob_start(); $this->_run($this->_file); 返回 $this->_filter(ob_get_clean()); //过滤输出 } }

有没有人有类似的经历,或者有解决方案?

【问题讨论】:

  • 我能知道你为什么需要禁用输出缓冲

标签: zend-framework zend-view


【解决方案1】:

有一件事,不要这样做

视图负责显示传递给它的内容。请求由控制器/动作接收,它们确定需要做什么、写入数据库、从数据库获取等。然后它们将输出分配给视图,视图显示它。

如果您开始在视图之外显示部分页面,那么您就破坏了 MVC 模型,这正是您应该使用 Zend Framework 的原因。

你的实际问题是什么?

编辑:

不要像这样运行 CRON 作业。将它们作为独立脚本运行并实例化 Zend 框架和库以供 CRON 使用。 CRON 不需要 MVC 模式即可运行、使用电子邮件或其他方式进行输出。您期望 CRON 的输出并将该输出用作确定 CRON 是否成功的有意义的方式这一事实并不是使用 CRON 的正确方法。您应该记录输出以供以后查看或通过电子邮件发送。

您可以实例化 ZF 而不是通过这样做来分派它

 $application->bootstrap();

不是这个

 $application->bootstrap()->run();

【讨论】:

  • 我 100% 同意你的看法。问题是 Zend_View 正在缓冲输出,在操作完成之前您看不到任何输出。但是,我们有 cron 作业,它们可能需要很长时间才能运行,我们希望“实时”查看输出(没有缓冲)。 Zend_Controller_Front::getInstance()->setParam('disableOutputBuffering', true);应该这样做,但它没有按预期工作。
【解决方案2】:

这适用于 ZF 版本 1。

根据this page,您必须在 public/index.php 中禁用输出缓冲(在引导调用之前和 Zend_Application 实例化之后):

我使用这样的东西:

$application = Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

if(APPLICATION_ENV !== 'production') {
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->setParam('disableOutputBuffering', true);
}

$application->bootstrap()->run();

请注意,在 application.ini 中设置此选项不起作用。

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 2012-04-01
    • 2011-04-20
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多