使用PHP输出缓冲功能将浏览器输出保存到文件中

PHP输出缓冲功能提供了一种在缓冲区发送到浏览器之前拦截缓冲区内容的便捷方法。每当您打印出某些内容时,输出就是发送到浏览器的任何内容。PHP使您可以在将输出发送到浏览器之前在缓冲区中捕获该输出。

输出缓冲由两种机制控制。首先是通过php.ini指令output_buffering,通常将其设置为off。可以通过将其设置为on或缓冲区可以占用的字节数来打开它。当此字节分配已满时,输出将发送到浏览器。

第二种机制是通过使用ob_start()函数来实现的,该函数为其运行的脚本打开输出缓冲。如果在php.ini文件中设置了输出缓冲,则不需要此设置,但是如果将其设置为“ off”,则尝试对缓冲区进行任何操作都会遇到一些错误。要开始输出缓冲,只需调用该ob_start()函数。

ob_start();

您尝试立即打印的所有内容都不会在脚本结束之前输出到浏览器。要将输出显式推送到浏览器,您可以调用该ob_flush()函数。

echo 'test';

ob_flush();

您可以随时通过调用ob_end_clean()或关闭输出缓冲ob_end_flush()。ob_end_clean()将关闭最上面的缓冲区(可以有多个缓冲区)并丢弃其中的内容。ob_end_flush()将输出最上面的缓冲区的内容,然后将其关闭。这是一种ob_end_flush()用于刷新和关闭所有可用输出缓冲区并输出其内容的简单方法。

while (@ob_end_flush());

您可以通过调用ob_get_contents()函数随时获取输出缓冲区的内容(只要您没有将其关闭)。这将返回当前缓冲区的内容。这是一个实际的例子。

<?php

ob_start();

echo 'test ';

?>

some more text

<?php

$out = ob_get_contents();

ob_end_flush();

// $out现在包含“测试更多文本”。

?>

该ob_flush()函数将清空当前的输出缓冲区,并将其发送到浏览器。因此,在获取缓冲区内容之后,调用此函数很重要。如果在尝试获取缓冲区内容之前调用它,那么那里将什么也没有。

使用该ob_get_contents()功能可以将文本输出到文件和浏览器。下面的示例将一些文本写入浏览器,并将此文本存储在脚本末尾写入文件的变量中。该文件将使用当前时间戳作为名称。确保您具有使用chmod写入此目录的足够权限。

$out = '';

ob_start();

echo 'test';

$out .= ob_get_contents();

ob_flush();

echo ' some more text to add to the buffer';

$out .= ob_get_contents();

ob_end_flush();

// 检查是否确实将某些内容写入了缓冲区

if (strlen($out) > 0) {

 $file = 'debug/' . time() . '.html';

 touch($file); 

 $fh = fopen($file, 'w');

 fwrite($fh, $out);

 fclose($fh);

}

ob_start()可以在没有任何参数的情况下调用该函数,但是您可以提供一个函数名,该函数名将用于在将缓冲区的内容发送给浏览器之前将其传递出去。使用此机制稍微容易些,因为可以从任何脚本中轻松删除它。回调函数必须具有单个字符串参数,该参数是缓冲区的内容,并且必须返回字符串,最好是缓冲区的内容。

function bufferCallBack($buffer)

{

// 检查是否确实将某些内容写入了缓冲区

 if (strlen($buffer) > 0) {

  $file = 'debug/' . time() . '.html';

  touch($file);

  $fh = fopen($file, 'w');

  fwrite($fh, $buffer);

  fclose($fh);

 }

 return $buffer;

}

 

ob_start('bufferCallBack');

echo 'test';

echo ' some more text to add to the buffer';

ob_end_flush();

请注意,使用输出缓冲可能会导致您网站的明显速度下降,因为一切都在发送给客户端之前在服务器端生成。

更新:在第二个示例中,添加了一些有关拥有正确权限的建议,并更正了变量名。感谢William指出此问题的电子邮件:)

以上是 使用PHP输出缓冲功能将浏览器输出保存到文件中 的全部内容, 来源链接: utcz.com/z/335682.html

回到顶部