使用输出缓冲区的函数在dev中工作但不是prod

时间:2013-12-04 00:34:10

标签: php

我在视图中使用此功能来定位各种内容块。

function block(&$block = false) {
    if ($block === false) return ob_end_clean();
    return ob_start(function($buffer) use (&$block) { $block = $buffer; });
}
直到今天我才一直遇到问题。我的街区没有出现在这个特定的项目上。

开发环境:使用Suhosin-Patch(cli)的PHP 5.3.3-7 + squeeze17(块显示)

脚本失败的生产环境(静默):PHP 5.4.4-14 + deb7u5(cli)(块不显示)

PHP日志没有显示任何内容。

你能帮我找一下发生的事吗?

修改

关于我如何使用此功能的更多信息。

说我有基本视图page.php

<h1><?= $title ?></h1>
<div class="content">
    <?= $content ?>
</div>
<?php block($scripts) ?>
<script>
    // javascript here
</script>
<?php block() ?>

然后在我的布局文件html.php

<html>
<head></head>
<body>
...
<?php if (isset($scripts)) print $scripts ?>
</body>
</html>

EDIT2:

我将这个课用于我的观点。

class view
{
    public static $globals;
    public function __construct($file, $layout = null) {
        $this->file = $file;
        if ($layout !== null) $this->layout = $layout;
    }
    public function __toString() {
        extract((array)self::$globals);
        extract((array)$this);
        start:
            ob_start();
            include PATH_VIEWS . $file;
            if (!isset($layout)) return ob_get_clean();
            $view = ob_get_clean();
            $file = $layout;
            unset($layout);
        goto start;
    }
}


die(new view('page.php', 'html.php');

1 个答案:

答案 0 :(得分:2)

ob_end_clean()仅返回最顶层的输出缓冲区。如果prod和dev对output_buffer(http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering)有不同的设置,你会看到不同的结果。您可以使用phpinfo()

进行检查

由于你的output_buffer选项匹配,你是否可以将include更改为require,以防万一导致路径混乱的服务器之间存在一些路径差异。