传统的 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();
}
}
~~~
![](https://img.kancloud.cn/c8/61/c8610ad315e691bac2915db8ae0a688e_527x195.png)
同理,当在 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);
}
~~~
![](https://img.kancloud.cn/52/2b/522be8b84836c79e28dce478936eceb1_1920x834.png)
- 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