原创

PHP如何构建流输出


配置 Nginx 和 PHP 实现流式输出

概述

本文档将简要介绍如何在 Nginx 和 PHP 中配置以实现流式输出(例如 Server-Sent Events, SSE)。通过正确的配置,可以确保数据逐条发送到客户端,而不是一次性发送。

步骤一:关闭 Nginx 的 Gzip 压缩

1. 修改 Nginx 配置文件

1.1 如果是没有安装插件的服务器

自行找到 Nginx 配置文件(通常是 /etc/nginx/nginx.conf 或站点配置文件),然后添加以下配置:

# 全局禁用 Gzip 和 Buffering
gzip off;
proxy_buffering off;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
if_modified_since off;
expires off;
etag off;

1.2 如果是使用宝塔面板

请在宝塔面板中修改当前站点的配置,不要改总配置文件,以避免代理冲突。在站点配置中添加以下内容:

# 全局禁用 Gzip 和 Buffering
gzip off;
proxy_buffering off;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
if_modified_since off;
expires off;
etag off;

步骤二:PHP 脚本配置请求头

确保 PHP 脚本正确处理流式输出。以下是一个简单的 PHP 脚本示例,用于生成流式输出:

<?php
// 禁用输出压缩
ini_set('zlib.output_compression', 'Off');

// 清除并关闭任何已有的输出缓冲
while (ob_get_level() > 0) {
    ob_end_flush();
}
ob_implicit_flush(1);  // 开启隐式刷新

// 设置响应头
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no'); // 如果使用 Nginx,可能需要这个头部来关闭缓冲

// 模拟流式输出
for ($i = 0; $i < 10; $i++) {
    $data = json_encode(array('response' => "这是第 {$i} 条消息"));
    echo "data: $data\n\n";  // SSE 格式的输出
    flush();  // 刷新输出缓冲区
    sleep(1); // 模拟延迟
}

exit;

测试和验证

1.保存配置文件

将上述 Nginx 配置保存到你的 Nginx 配置文件中(如果是宝塔面板,请在宝塔面板中保存)。

2.测试 Nginx 配置

使用以下命令测试 Nginx 配置是否正确:

sudo nginx -t

3.重启 Nginx

如果配置测试通过,重启 Nginx 以应用更改:

sudo systemctl restart nginx

4.使用浏览器开发者工具

打开浏览器开发者工具,查看网络请求,确保数据逐条发送。在“网络”标签页中选择你的请求,查看响应是否是逐条发送的。

5.使用 curl 命令测试

接下来可以使用 curl 命令来测试流式输出是否正常工作:

curl -X GET http://proxyapi.zhangyaoyu.top/test.php  --http1.1

通过以上步骤,应该能够成功配置 Nginx 和 PHP 以支持api或者界面的流式输出。

希望这个的教程对你有帮助

PHP语言
服务器运维