搜尋
首頁後端開發php教程php中緩衝區的範例詳解

php中緩衝區的範例詳解

Aug 10, 2017 am 11:27 AM
php範例緩衝區

PHP緩衝區是預設開啟的,它的預設參數在php.ini設定檔中,值是4096位元組。在其中找到output_buffering配置參數來修改PHP緩衝區的大小。

開發者也可以在腳本中透過ob_start()函數手動處理PHP緩衝區機制。這樣即便輸出內容超過了配置參數的大小,也不會把資料傳送給瀏覽器,ob_start()將PHP緩衝區空間設定到足夠大,只有腳本執行結束後或呼叫 ob_end_flush()函數,才會把資料傳送給瀏覽器。

我們編輯php.ini設定文件,對output_buffering值進行修改並做以下測試。當output_buffering修改為4096時,輸出較少數據,讓它小於一個PHP緩衝區。程式碼如下:

for ($i = 0; $i< 10; $i++) {    
echo $i . &#39;<br/>&#39;;
    sleep($i + 1);      
    //}

執行後你會發現,它不會像常規邏輯每隔幾秒鐘就有輸出,而是直到腳本循環結束後,才會一次輸出。這種情況在腳本處理結束之前,瀏覽器介面會一直保持空白,這是由於資料量太小,輸出緩衝區沒有寫滿。寫入資料的順序:echo語句輸出到PHP緩衝區、TCP緩衝區、瀏覽器。

接下來我們再修改output_buffering=0,仍輸出較少數據,但實際數據已經大於PHP緩衝區。程式碼如下:

 for ($i = 0; $i< 10; $i++) {    echo $i . &#39;<br/>&#39;;
    flush();  //通知操作系统底层,尽快把数据发给客户端浏览器
    sleep($i + 1);      //}

此腳本的結果與剛才一定不一致,因為將緩衝區的容量設為0,也就是停用PHP緩衝區機制。 這時我們會在瀏覽器看到斷斷續續的間斷性輸出,而不必等到腳本執行完畢才看到輸出。這是因為,資料沒有在輸出快取中停留。寫資料的順序依序是echo輸出到TCP緩衝區,再輸出給瀏覽器。 我們再把參數修改為output_buffering=4096,輸出資料大於一個緩衝區。此例中不呼叫ob_start()函數。 準備一個4KB大小的檔案或使用dd指令在shell下建立一個檔案:

 $dd if=/dev/zero of=f4096 bs=4096 count=1

使用以下程式碼進行驗證:

for ($i = 0; $i< 10; $i++) {    
echo file_get_contents(&#39;./f4096&#39;) . $i . &#39;<br/>&#39;;
    sleep($i +1);
    }

可以看到,程式回應還沒結束(HTTP連線並未關閉),就可以看到間斷性輸出,瀏覽器介面不會一直保持空白。儘管啟用了PHP輸出緩衝區機制,但依然會間斷性輸出,而不是一次性輸出,這是因為PHP緩衝區空間不夠用,每寫滿一個緩衝區,資料就會傳送到客戶端瀏覽器。

和上例參數一樣,即output_buffering=4096,輸出資料大於一個PHP緩衝區。這次我們呼叫ob_start(),程式碼如下:

ob_start();      
//开启PHP缓冲区
for ($i = 0; $i< 10; $i++) {    
echo file_get_contents(&#39;./f4096&#39;) . $i . &#39;<br/>&#39;;
    sleep($i + 1);
}
ob_end_flush();

等到服務端腳本全部處理完,回應結束才會看到完整的輸出。輸出間隔時間很短,以至於感受不到停頓。在輸出之前,瀏覽器一直會保持空白,等待伺服器端資料。這是因為,PHP一旦呼叫了ob_start()函數,就會將PHP緩衝區擴展到足夠大,直到ob_end_flush函數呼叫或腳本運行結束才發送PHP緩衝區中的數據到客戶端瀏覽器。

ob_start啟動output_buffering機制。一旦激活,腳本不再直接輸出給瀏覽器,而是先暫時寫入PHP緩衝區。 PHP預設開啟output_buffering機制,透過呼叫ob_start()函數把output_buffering值擴展到夠大。也可以透過$chunk_size來指定output_buffering的值。 $chunk_size預設值是0,表示直到腳本執行結束後,PHP緩衝區中的資料才會傳送到瀏覽器。若設定了$chunk_size的大小,表示只要緩衝區中資料長度達到了該值,就會將緩衝區中的資料傳送到瀏覽器。

可以透過指定$ouput_callback參數來處理PHP緩衝區中的數據,例如函數ob_gzhandler(),將緩衝區中的資料壓縮後再傳送給瀏覽器。

ob_get_contents()函數是取得一份PHP緩衝區中的資料拷貝,這是一個重要的函數。請看以下範例:

<?phpob_start();   
?>
<html>
<body>today is <?php echo date(&#39;Y-m-d h:i:s&#39;);  
 ?>
</body>
</html>
<?php
$output = ob_get_contents();
ob_end_flush();echo &#39;<! output>&#39;.$output;?>

以上腳本執行後,檢視原始程式碼,會出現兩段相同的HTML,後者就是透過ob_get_contents()函數取得緩衝區裡的內容。

ob_end_flush()ob_end_clean()這兩個函數都會關閉輸出緩衝。

不同的是,ob_end_flush()只是把PHP緩衝區中的資料傳送到客戶端瀏覽器,而ob_clean_clean()將PHP緩衝區中的資料刪除,但不發送給客戶端。

ob_end_flush()呼叫之後,PHP緩衝區中的資料依然存在,ob_get_contents()仍可取得PHP緩衝區中的資料拷貝。

以上是php中緩衝區的範例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何使PHP應用程序更快如何使PHP應用程序更快May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster,關注台詞:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

PHP性能優化清單:立即提高速度PHP性能優化清單:立即提高速度May 12, 2025 am 12:07 AM

到ImprovephPapplicationspeed,關注台詞:1)啟用opcodeCachingwithapCutoredUcescriptexecutiontime.2)實現databasequerycachingingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandreduceconnection.4 limitesclection.4.4

PHP依賴注入:提高代碼可檢驗性PHP依賴注入:提高代碼可檢驗性May 12, 2025 am 12:03 AM

依赖注入(DI)通过显式传递依赖关系,显著提升了PHP代码的可测试性。1)DI解耦类与具体实现,使测试和维护更灵活。2)三种类型中,构造函数注入明确表达依赖,保持状态一致。3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

PHP性能優化:數據庫查詢優化PHP性能優化:數據庫查詢優化May 12, 2025 am 12:02 AM

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi

簡單指南:帶有PHP腳本的電子郵件發送簡單指南:帶有PHP腳本的電子郵件發送May 12, 2025 am 12:02 AM

phpisusedforsenderemailsduetoitsbuilt-inmail()函數andsupportivelibrariesLikePhpMailerAndSwiftMailer.1)usethemail()functionForbasiceMails,butithasimails.2)butithasimail.2)

PHP性能:識別和修復瓶頸PHP性能:識別和修復瓶頸May 11, 2025 am 12:13 AM

PHP性能瓶颈可以通过以下步骤解决:1)使用Xdebug或Blackfire进行性能分析,找出问题所在;2)优化数据库查询并使用缓存,如APCu;3)使用array_filter等高效函数优化数组操作;4)配置OPcache进行字节码缓存;5)优化前端,如减少HTTP请求和优化图片;6)持续监控和优化性能。通过这些方法,可以显著提升PHP应用的性能。

PHP的依賴注入:快速摘要PHP的依賴注入:快速摘要May 11, 2025 am 12:09 AM

依賴性注射(DI)InphpisadesignPatternthatManages和ReducesClassDeptions,增強量強制性,可驗證性和MATIALWINABIOS.ItallowSpasspassingDepentenciesLikEdenciesLikedAbaseConnectionStoclasseconnectionStoclasseSasasasasareTers,interitationAseTestingEaseTestingEaseTestingEaseTestingEasingAndScalability。

提高PHP性能:緩存策略和技術提高PHP性能:緩存策略和技術May 11, 2025 am 12:08 AM

cachingimprovesphpermenceByStorcyResultSofComputationsorqucrouctationsorquctationsorquickretrieval,reducingServerLoadAndenHancingResponsetimes.feftectivestrategiesinclude:1)opcodecaching,whereStoresCompiledSinmememorytssinmemorytoskipcompliation; 2)datacaching datacachingsingMemccachingmcachingmcachings

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器