輸出控制函數

另請參閱

另請參閱 header()setcookie().

目錄

添加說明

用戶貢獻說明 10 條說明

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 文件,但您可能希望返回該文件中腳本「echo」的字符串。

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
17 年前
Fedora Core 版本 4 (Stentz) 的 php-5.0.4-10.5 RPM 中,輸出緩衝默認為 '4096' 而不是 'Off' 或 '0'。這讓我浪費了太多時間!
della at sun dot com
15 年前
有時用戶會抱怨頁面速度慢... 卻沒有意識到這主要是由於網絡問題造成的。
因此我決定在我的頁面末尾添加一些統計信息

在開始時,我啟動計數器

<?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 是我用来打印字节大小的函数)
trucex [um, at] gmail [um, dot] com
17 年前
不幸的是,PHP 开发者并没有在任何图像输出函数中内置支持,来返回图像而不是输出它。

幸运的是,我们可以使用输出缓冲来解决这个问题。

<?php

$im
= imagecreatetruecolor(200, 200);

// 其他图像函数在此处...

ob_start();
imagepng($im);
$imageData = ob_get_contents();
ob_clean();

?>

现在你可以使用 $imageData 变量来创建另一个 GD 图像,保存它,把它放到数据库中,对二进制数据进行修改,或者把它输出给用户。你也可以很容易地检查它的大小,而不用访问磁盘...只需使用 strlen() 即可。
webmaster at wistex dot com
17 年前
这真是让我大开眼界。我遇到一个问题,在运行 IIS 的 Windows 2003 上,MySQL 在 ASP/VBScript 页面上的速度非常慢... 服务器上也安装了 PHP 和 Microsoft SQL 2005 Express。(是的,我们正在同一个 Windows 2003 服务器上使用 IIS 运行 ASP、PHP、MySQL 和 MS SQL。)

我在网上搜索解决方案,看到一个建议,如果 PHP 页面的 MySQL 速度慢,可以将 output_buffering 设置为 on。由于我们也从同一个服务器上使用 MySQL 提供 PHP 页面,所以这引起了我的注意。为了尝试一下,我在 php.ini 中将 output_buffering 设置为 on,突然间 MySQL 和 ASP 变快了... MySQL 和 PHP 变快了... Microsoft SQL Server 2005 Express 和 ASP 变快了.... 一切都变快了... 甚至那些没有使用 PHP 的东西也变快了!

我甚至没有重启 IIS。当我保存了更改后的 php.ini 文件后,一切就都变快了。

看来 PHP、MySQL 和 IIS 以某种方式紧密相连,改变缓冲设置实际上会影响整个服务器的性能。

所以,如果你在 Windows 2003 & IIS 上遇到了性能问题,并且恰好安装了 PHP,可以尝试在 php.ini 中将 output_buffering 设置为 On。将它设置为 off 似乎会严重影响 Windows 2003 和 IIS 的性能... 即使对于那些不使用 PHP 或 MySQL 的网页也是如此。
To Top