PHP Conference Japan 2024

輸出控制函式

另請參閱

另請參閱 header()setcookie()

目錄

新增註釋

使用者貢獻的註釋 8 則註釋

jgeewax a t gmail
17 年前
使用輸出緩衝時,如果一個被 include 的檔案在輸出緩衝區關閉之前呼叫了 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 年前
我在對導入的圖片進行輸出緩衝和繪製文字時,記憶體不足。瀏覽器只顯示了 500 萬像素圖片的上半部分。請嘗試在 php.ini 檔案 ( memory_limit = 16M; ) 或 .htaccess 檔案 ( php_value memory_limit "16M" ) 中增加記憶體限制。也可以參考 memory_get_usage() 函式。
kamermans at teratechnologies dot net
18 年前
Fedora Core release 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