news 2026/9/28 6:04:43

PHP+HTML实现流式输出效果的示例详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP+HTML实现流式输出效果的示例详解

效果演示

后端代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<?php

// 关闭输出缓冲

ini_set('output_buffering','off');

ini_set('zlib.output_compression', false);

while(ob_get_level()) ob_end_clean();// 清除所有缓冲层

// 设置HTTP头(流式内容类型 + 禁用缓存)

header('Content-Type: text/plain; charset=utf-8');

header('Cache-Control: no-cache');

header('X-Accel-Buffering: no');

// 模拟对话回复内容

$messages= [

"你好!我正在分析您的问题...\n",

"已找到相关解决方案,请稍等。\n",

"处理完成!以下是详细回答:\n"

];

// 流式输出每条消息

foreach($messagesas$msg) {

// 逐字输出(可选)

// $length = strlen($msg);

$length= mb_strlen($msg);

for($i=0;$i<$length;$i++) {

// echo $msg[$i];

$char= mb_substr($msg,$i, 1,'UTF-8');

echo$char;

ob_flush();// 刷新PHP缓冲

flush();// 刷新Web服务器缓冲

usleep(50000);// 50ms延迟模拟打字效果

}

}

// 持续生成内容的例子(如从数据库/API获取)

for($i=1;$i<=5;$i++) {

echo"正在处理第 {$i} 项任务...\n";

ob_flush();

flush();

sleep(1);

}

前端代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

<!DOCTYPE html>

<htmllang="en">

<head>

<metacharset="UTF-8">

<metaname="viewport"content="width=device-width, initial-scale=1.0">

<title>智能客服系统</title>

<style>

body {

font-family: Arial, sans-serif;

display: flex;

justify-content: center;

align-items: center;

height: 100vh;

margin: 0;

background-color: #f4f4f9;

}

.chat-container {

width: 800px;

background-color: #fff;

border-radius: 10px;

box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);

padding: 20px;

}

.messages {

height: 500px;

overflow-y: auto;

border-bottom: 1px solid #ddd;

padding-bottom: 10px;

}

.message {

margin: 10px 0;

}

.user {

text-align: right;

}

.bot {

text-align: left;

}

.input-container {

display: flex;

margin-top: 10px;

}

.input-container input {

flex: 1;

padding: 10px;

border: 1px solid #ddd;

border-radius: 5px;

}

.input-container button {

padding: 10px 20px;

border: none;

background-color: #007bff;

color: #fff;

border-radius: 5px;

cursor: pointer;

}

.input-container button:hover {

background-color: #0056b3;

}

</style>

</head>

<body>

<divclass="chat-container">

<divclass="messages"id="messages"style="white-space: pre-wrap;"></div>

<divclass="input-container">

<inputtype="text"id="userInput"placeholder="输入消息...">

<buttononclick="sendMessage()">发送</button>

</div>

</div>

<script>

function sendMessage() {

const userInput = document.getElementById('userInput').value;

if (userInput.trim() === '') return;

document.getElementById('userInput').value = '';

const messagesContainer = document.getElementById('messages');

const userMessage = document.createElement('div');

userMessage.className = 'message user';

userMessage.textContent = userInput;

messagesContainer.appendChild(userMessage);

fetch('stream.php')

.then(response => {

const reader = response.body.getReader();

const decoder = new TextDecoder('utf-8');

const botMessage = document.createElement('div');

botMessage.className = 'message bot';

messagesContainer.appendChild(botMessage);

function readChunk() {

return reader.read().then(({ done, value }) => {

if (done) return;

// 将二进制数据解码为文本

const text = decoder.decode(value);

// 实时追加到页面

botMessage.innerHTML += text;

messagesContainer.scrollTop = messagesContainer.scrollHeight;

// 继续读取下一块

return readChunk();

});

}

return readChunk();

})

.catch(console.error);

}

</script>

</body>

</html>

运行测试

项目根目录下打开命令行输入以下命令,执行

1

php -S 127.0.0.1:6789

打开浏览器,输入127.0.0.1:6789访问Web界面,输入任意内容发送后,即可看到流式输出效果

原理解析

1. 什么是流式输出

流式输出通常指的是在数据生成的同时逐步发送到客户端,而不是等待所有处理完成后再一次性发送。这在实时聊天应用或需要逐步显示结果的场景中很常见。

2. PHP怎么做到流式输出

PHP默认是缓冲输出的,也就是说,脚本执行完毕后才会将内容发送到浏览器。所以需要调整输出缓冲的设置。比如调用ob_flush()和flush()来实时发送内容。

3. 前端处理数据的接收和显示

前端监听来自服务器的事件,每次接收到数据就更新页面。本次实践通过Fetch读取流式响应体,逐块处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 6:04:42

多平台大文件上传兼容性实战:分片、Worker与S3协议

1. 兼容性问题到底藏在哪些环节&#xff1a;从浏览器到对象存储的完整链路做上传模块这些年&#xff0c;我最大的感受是&#xff1a;大文件上传的多平台兼容性问题&#xff0c;真正难的地方往往不是某一段代码写不出来&#xff0c;而是你根本说不清问题卡在哪一段。同一个 2GB …

作者头像 李华
网站建设 2026/9/28 6:04:43

3步搞定wordpress中文在线字体 图解步骤解决访问慢

3步搞定wordpress中文在线字体 图解步骤解决访问慢 网站做好了没人访问,是不是特别扎心?很多老板觉得代码写完、页面点亮就算完工,结果打开浏览器转圈半天,用户早就跑了。别急,这往往不是内容问题,而是加载速度在拖后腿。特别是中文网站,字体文件动辄几MB,首屏白屏时间直接翻倍。…

作者头像 李华
网站建设 2026/9/28 6:04:18

微星B350M BIOS重置原理与实操避坑指南

1. 为什么BIOS重置不是“按个键就完事”——从B350M实战看微星主板的底层逻辑你手里的那块微星B350M迫击炮&#xff0c;或者任何一块微星主板&#xff0c;它的BIOS不是Windows桌面右下角那个可以双击关闭的程序。它是一段固化在主板南桥附近SPI Flash芯片里的固件&#xff0c;是…

作者头像 李华
网站建设 2026/9/28 6:04:07

搞懂网站二级域名建站属于子站吗完整流程避坑

搞懂网站二级域名建站属于子站吗完整流程避坑 改个需求建站公司拖一周,这种憋屈感谁懂?我干了十年建站,见过太多老板被这种“拖字诀”搞心态。其实很多时候,不是公司懒,而是没搞懂 网站二级域名建站属于子站吗 这个底层逻辑,导致技术架构混乱,改一处动全身。今天咱们不整虚的,直接拆解这套 完整流程…

作者头像 李华
网站建设 2026/9/28 6:03:51

深度学习文本分类实战:从NLTK预处理到TFRecord的完整数据管线

简介&#xff1a;这是一份基于深度学习的自动文本分类系统完整源码包&#xff0c;面向希望掌握Python自然语言处理与深度学习分类流程的开发者。系统整合NLTK文本预处理、特征向量化&#xff0c;以及CNN/RNN/LSTM等模型训练与预测模块&#xff0c;可应用于垃圾邮件识别、情感分…

作者头像 李华
网站建设 2026/9/28 6:03:45

网站中的滑动栏怎么做的?3种方案对比评测,零基础也能搞定

网站中的滑动栏怎么做的?3种方案对比评测,零基础也能搞定 想做个漂亮的官网,首页那个自动轮播的“滑动栏”是门面。但很多独立站长卡在第一步:自己不会代码,想做网站却不知从何下手。别慌,这行干了10年,见过太多人被“技术门槛”劝退。其实,做滑动栏没你想的那么玄乎。今天咱们不聊虚的,直接上干货,对目前主流…

作者头像 李华