本文档将简要介绍如何在 Nginx 和 PHP 中配置以实现流式输出(例如 Server-Sent Events, SSE)。通过正确的配置,可以确保数据逐条发送到客户端,而不是一次性发送。
自行找到 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;
请在宝塔面板中修改当前站点的配置,不要改总配置文件,以避免代理冲突。在站点配置中添加以下内容:
# 全局禁用 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
// 禁用输出压缩
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;
将上述 Nginx 配置保存到你的 Nginx 配置文件中(如果是宝塔面板,请在宝塔面板中保存)。
使用以下命令测试 Nginx 配置是否正确:
sudo nginx -t
如果配置测试通过,重启 Nginx 以应用更改:
sudo systemctl restart nginx
打开浏览器开发者工具,查看网络请求,确保数据逐条发送。在“网络”标签页中选择你的请求,查看响应是否是逐条发送的。
接下来可以使用 curl 命令来测试流式输出是否正常工作:
curl -X GET http://proxyapi.zhangyaoyu.top/test.php --http1.1
通过以上步骤,应该能够成功配置 Nginx 和 PHP 以支持api或者界面的流式输出。
希望这个的教程对你有帮助