傳統的 Web PHP 的 `echo` `var_dump` ....等等輸出函數輸出數據流程:
php `echo`,`var_dump `->?php `output_buffering `-> webServer buffer->?browser buff ->?browser display
php 輸出語句/函數 -> php 緩沖區配置 -> web 服務器緩沖區配置 -> 瀏覽器緩沖區 ->瀏覽器顯示
PHP 緩沖區配置主要由 `php.ini` 中的 `output_buffering` 配置的,在默認情況下,`output_buffering = 4096`。
當 PHP 輸出數據時,輸出的數據將會先經過 `output_buffering` 中,直到數據大于`output_buffering` 配置的值或者 PHP 文件執行完畢,則會將數據輸出
例子:
~~~
<?php
// 開啟buffer緩沖區 php-cli下默認關閉buffer,由于web訪問測試較麻煩,該段代碼只為了查看以及測試緩沖區的作用,在web模式下,默認開啟,無需手動開啟,可自行配置
ob_start();
for ($i = 0; $i < 50; $i++) {
echo $i;
sleep(1);
if ($i % 10 == 0) {
echo '輸出一次', PHP_EOL;
// 當i為10的倍數時,將直接結束并輸出緩沖區的數據,然后再次開啟緩沖區
ob_end_flush();
ob_start();
}
}
~~~

同理,當在 web 訪問時,php 默認開啟 4096 的緩沖區,當里面存取的字符串長度超過時,將會進行一次輸出到 web 服務器,可通過`ob_start()`和`ob_end_flush`進行直接的緩沖區控制(此間將會無視`output_buffering`的值)
> PS:
> php-cli 默認關閉緩沖區并且無視 `output_buffering`的值,需要通過`ob_start()` 函數進行打開
`ini_set`無法修改`output_buffering`的配置
當 php.ini 中 php buffer 是關閉的,再次調用`ob_end_flush()`會報 warning。
### **為什么web瀏覽器不能查看到分段輸出的值,原因為:web服務器還有一次緩沖區**
Nginx 分段輸出例子:
~~~php
<?php
set_time_limit(0);
ob_end_clean();
ob_implicit_flush();
header('X-Accel-Buffering: no'); // 關鍵是加了這一行。
for ($i = 0; $i < 1000; $i++) {
echo $i;
sleep(1);
}
~~~

- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS