php - 在输出缓冲区上循环

标签 php output-buffering

我看到 ob_start()ob_end_*() 的一些行为似乎非常违反直觉。

本着简洁的精神,我的算法是:

  1. 打开缓冲区
  2. 做一些事情
  3. 将缓冲区保存为字符串
  4. 关闭缓冲区

对于第一种情况之外的每个循环情况,我在运行时收到以下通知。

Notice: ob_end_clean(): failed to delete buffer. No buffer to delete in C:...\testing\TestOBError.php on line 21

Notice: ob_end_clean(): failed to delete buffer. No buffer to delete in C:...\testing\TestOBError.php on line 21

Notice: ob_end_clean(): failed to delete buffer. No buffer to delete in C:...\testing\TestOBError.php on line 21

Current story payload: `one'.

Current story payload: `two'.

Current story payload: `three'.

Current story payload: `four'.

示例代码(TestOBError.php):

<?php
class Story {
    public $payload;
    public function __construct($payload) {
        $this->payload = $payload;
    }
}

$stories = array();
$stories[] = new Story('one');
$stories[] = new Story('two');
$stories[] = new Story('three');
$stories[] = new Story('four');

$foo = "";

foreach ($stories as $story) {
    ob_start();
    require 'TestOBError_Foo.php';
    $foo .= ob_get_clean();
    ob_end_clean();
}

print $foo;

?>

TestOBError_Foo.php 的内容:

<p>Current story payload: `<?php print $story->payload; ?>'.</p>

我只是误用了输出缓冲区吗?谁能告诉我执行此操作的“正确方法”?

我正在运行 PHP 5.4.7 版。

最佳答案

您不需要同时调用 ob_get_clean()ob_end_clean()。要么这样做:

$foo .= ob_get_clean();

或者这样做:

$foo .= ob_get_contents();
ob_end_clean();

来自PHP manual :

string ob_get_clean ( void )

Gets the current buffer contents and delete current output buffer.

ob_get_clean() essentially executes both ob_get_contents() and ob_end_clean().

关于php - 在输出缓冲区上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683651/

相关文章:

php - ob_flush 和 ob_end_flush 有什么区别?

zend-framework - 如何阻止 ZF 在开头发送空字符?

php - 将文本区域中的行保存到数据库

PHP 订单捕获门户

php - 在 PHP 中,有没有一种方法可以在不使用输出缓冲的情况下将 PHP 文件的输出捕获到变量中?

php - flush() 在 PHP 中不显示输出?

php - text-rotate 属性在 PHP 的电子邮件正文中不起作用

php - 在服务器端处理 plupload 的分块上传

php - 如何强制 PHP 将 fatal error 呈现为纯文本?

php - php输出缓冲区如何工作(使用$_SERVER ['REQUEST_TIME']计算脚本执行时间的问题)