PHP Conference Japan 2024

输出控制函数

参见

另请参见 header()setcookie()

目录

添加注释

用户贡献的注释 8 条注释

jgeewax a t gmail
17 年前
在使用输出缓冲时,如果包含的文件在输出缓冲区关闭之前调用了 die(),则会刷新而不是清除该文件。也就是说,默认情况下会调用 ob_end_flush()。

<?php
// a.php(此文件永远不应该显示任何内容)
ob_start();
include(
'b.php');
ob_end_clean();
?>

<?php
// b.php
print "b";
die();
?>

这最终会打印“b”而不是什么都没有,因为调用了 ob_end_flush() 而不是 ob_end_clean()。也就是说,die() 会刷新缓冲区而不是清除它。我花了一段时间才确定是什么导致了刷新,所以我想分享一下。
匿名
15 年前
您可能还想在输出刷新后结束基准测试。

<?php
your_benchmark_start_function
();

ob_start ();
for (
$i = 0; $i < 5000; $i++)
echo
str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";

<----------
echo
your_benchmark_end_function(); |
ob_end_flush (); ------------------------
?>
gruik at libertysurf dot fr
20 年前
对于那些正在寻找优化的人,请尝试使用缓冲输出。

我注意到输出函数调用(即 echo())在某种程度上是耗时的。当使用缓冲输出时,只进行一次输出函数调用,并且似乎快得多。
试试这个

<?php
your_benchmark_start_function
();

for (
$i = 0; $i < 5000; $i++)
echo
str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";

echo
your_benchmark_end_function();
?>

然后

<?php
your_benchmark_start_function
();

ob_start ();
for (
$i = 0; $i < 5000; $i++)
echo
str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";

echo
your_benchmark_end_function();
ob_end_flush ();
?>
Attila Houtkooper
9 年前
在使用 ob_start 和 ob_get_contents 时,请注意代码中的异常。如果您不这样做,对 ob_start 的调用次数将与对 ob_end 的调用次数不匹配,您将不会度过美好的时光。

<?php
public function requireIntoVariable($path) {
ob_start();

try {
require
$path;
} catch (
Exception $e) {
ob_end_clean();
throw
$e;
}

$output = ob_get_contents();
ob_end_clean();
return
$output;
}
?>
basicartsstudios at hotmail dot com
17 年前
有时您可能不想在 include() 或 require() 函数定义的规范下包含 php 文件,但您可能希望作为返回值获取文件中脚本“回显”的字符串。

Include() 和 require() 都直接输出已评估的代码。

为了避免这种情况,请尝试使用输出缓冲
<?php
ob_start
();
eval(
file_get_contents($file));
$result = ob_get_contents();
ob_end_clean();
?>

<?php
ob_start
();
include(
$file);
$result = ob_get_contents();
ob_end_clean();
?>
我认为这与上面一样,如果我错了请纠正我。

此致,BasicArtsStudios
kend52 at verizon dot net
19 年前
在输出缓冲和在导入的图像上绘制文本时,我用完了内存。浏览器只显示了 5MP 图像的顶部部分。尝试在 php.ini 文件(memory_limit = 16M;)或 .htaccess 文件(php_value memory_limit "16M")中增加内存限制。另请参见函数 memory_get_usage()。
kamermans at teratechnologies dot net
18 年前
在 Fedora Core 版本 4 (Stentz) 的 php-5.0.4-10.5 RPM 中,输出缓冲默认设置为“4096”而不是“Off”或“0”。这让我浪费了很多时间!
della at sun dot com
16 年前
有时用户会抱怨页面速度慢……没有意识到这主要是因为网络问题。
所以我决定在我的页面末尾添加一些统计信息

一开始我启动计数器

<?php
function microtime_float() {
if (
version_compare(PHP_VERSION, '5.0.0', '>')) return microtime(true);
list(
$u,$s)=explode(' ',microtime()); return ((float)$u+(float)$s);
}
$initime=microtime_float();
ob_start();
ob_implicit_flush();
?>

最后,我显示统计信息

<?php
echo "PHP 时间: ".round((microtime_float()-$initime)*1000)." 毫秒. ";
echo
"大小: ".round_byte(strlen(ob_get_contents()));
ob_end_flush();
?>

(round_byte 是我用于打印字节大小的函数)
To Top