首页 > 编程语言 >解决php因为输出内容太短无法流式(Stream)输出问题

解决php因为输出内容太短无法流式(Stream)输出问题

时间:2024-06-03 15:59:34浏览次数:15  
标签:输出 Stream 流式 太短 内容 长度 php data

实测得知,如果用PHP做流式输出每次echo的内容太短的话,就没有流式的效果了,而是会等输出的长度达到一定时前端才能拿到结果,如下:

 

 

这是我这边的测试结果,可见,这里仅接收到了两次流式输出,但是我在PHP里是输出了10次,从而证明了每次流式的内容达到一定长度时才能有流式得到效果,这个长度到底是多少,我没有细致去测试了,我的想法是:判断下输出的内容的长度,如果不够1024,则拼接一些内容,再在前端剔除这些拼接的内容即可,这样前端就无损后端的操作了。

完整PHP代码如下,不需要更改nginx或者php.ini的配置:

function actionStreamOut()
{
	$flag = "[[++--~!@#$%^&*()--++]]";

	// 设置脚本超时时间,以防止脚本被服务器过早终止
	set_time_limit(0);
	// 禁用输出缓冲
	while (ob_get_level()) {
		ob_end_flush();
	}
	ob_implicit_flush(true);
	header('Content-Type: text/event-stream'); // 必须要加

	$data = json_encode([
		'data' => '测试短文本'
	], JSON_UNESCAPED_UNICODE); // 长度太短无法流式
	// 填充数据长度不够1024的情况
	while (strlen($data) < 1024) {
		$data .= $flag; // ai生成的内容总不会有这种内容吧?前端拿到后再多次剔除即可还原真正的消息了
	}
	for ($i = 1; $i <= 10; $i++) {
		echo $i . "{$data}\n";
		// 强制刷新输出缓冲区
		flush();
		// 模拟延迟,便于观察输出效果
		usleep(200000);
	}
}

  

前段接收到消息后,再全量剔除一下flag内容,代码如下:

var pattern = /\[\[\+\+--~!@#\$%\^&\*\(\)--\+\+\]]/g; // 匹配特定字符串的正则表达式
var result = str.replace(pattern, ''); // 删除所有匹配到的特定字符串
console.log(result);

  

实验一下:

 

没问题!

这篇分享文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎在评论区留言,我会尽力回答。同时,如果你觉得这篇文章对你有帮助,不妨点个赞并分享给其他同学,让更多人受益。

想要了解更多相关知识,可以查看我以往的文章,其中有许多精彩内容。记得关注我,获取及时更新,我们可以一起学习、讨论技术,共同进步。

感谢你的阅读与支持,期待在未来的文章中与你再次相遇!

我的微信公众号:【xdub】,欢迎大家订阅,我会同步文章到公众号上。

标签:输出,Stream,流式,太短,内容,长度,php,data
From: https://www.cnblogs.com/shuinanxun/p/18229075

相关文章

  • 模拟集成电路设计系列博客——6.3.2 单电源正输出转换器
    6.3.2单电源正输出转换器一个快速单端正极输出D/A(一般用于视频RAM中,称为RAMDAC)如下图所示[Colles,1988]:此处,一个匹配反馈回路被用于精确已知的电流源偏置(注意,此处放大器的输入连接看上去是反的,但是由于信号通过\(Q_4\)反相,因此这样连接才是对的)。同时,为了保持独立于\(V_{out}......
  • 无法直接启动带有”类库输出类型“的项目。若要调试此项目,请向引用库项目的此解决方案
    原文链接:https://blog.csdn.net/m0_56366948/article/details/137480405当你尝试直接启动一个类库(ClassLibrary)项目时,你会遇到这样的错误消息,因为类库项目本身不生成可执行文件(如.exe文件),它们只是包含可以被其他程序或应用程序引用的代码。为了调试类库项目,你需要创建一个可......
  • 输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)
    解题思路:        定义两个(int*)型指针变量p1和p2,使它们分别指向a和b。使p1指向a和b中的大者,p2指向小者,顺序输出*p1,*p2就实现了按先大后小的顺序输出a和b。编写程序:运行结果:程序分析:        输入a的值45,b的值78,由于a<b,将p1的值和p2的值交换,即将p1的指向......
  • YOLOv8输出视频.avi有损转.mp4(使用ffmpeg)
    问题:在使用YOLOv8模型直接推理视频后,存储的视频文件格式默认为.avi格式,且推理出的视频占用空间巨大,亲测500多M的视频推理完保存的结果视频有25个多G,此时当视频在服务器上时,想预览就需要下载至本地,对于这么大的视频要耗费大量时间。解决办法:可以使用ffmpeg视频处理工具对.avi格......
  • 新时代的程序员4大本领:lambda表达式,链式编程,函数式接口,Stream流式计算
    传统程序员4大本领:泛型,枚举,反射,注解新时代的程序员4大本领:lambda表达式,链式编程,函数式接口,Stream流式计算lambda表达式//1.不需要参数,返回值为5()->5//2.接收一个参数(数字类型),返回其2倍的值x->2*x//3.接受2个参数(数字),并返回他们的差值(x,y)->x......
  • 输入输出
    输入需导包:importjava.util.Scanner;1.字符串的输入Strings1=s.nextLine();//读取输入直到换行符为止,包括换行符本身,然后返回整行的文本(不包括换行符)Strings2=s.next();//会跳过空白字符(空格、制表符、换行符等),直到找到下一个单词为止,并返回该单词*总的来说,nextLine()......
  • Java运算符 二进制计算 素数问题 九九乘法表 月份问题 分解质因数 完全数问题 天数计
    1.代码观察inta=6--;System.out.println(a);在Java中,后置递减运算符--只能在整型(int)和长整型(long)变量上使用,而且必须将--放在变量值的后面。因此,6--是非法的,Java编译器会报错。正确代码如下inta=6;a--;System.out.println(a);输出结果为52.代码分析Syst......
  • 【第7章 | 输入/输出系统】(操作系统 慕课版)
    目录一、I/O系统的功能、模型与接口1.1I/O系统的基本功能1.2I/O系统的层次结构与模型1.3I/O系统的接口二、I/O设备和设备控制器2.1I/O设备2.2设备控制器2.3内存映像I/O2.4I/O通道2.5I/O设备的控制方式知识回顾三、I/O软件3.1中断处理程序3.2设备驱动程序3.3与设......
  • Windows bat批处理多行内容输出到指定文件
    前言全局说明一、说明二、要写入到desktop.ini的内容echo[.ShellClassInfo]echoIconResource=favicon.icoechoIconFile=favicon.icoechoIconIndex=0三、bat批处理代码@Echooffchcp65001>nul(echo[.ShellClassInfo]echoIconResource=favicon.icoec......
  • Idea中关于输出控制台中文乱码解决
    元注解@Target(value={ElementType.TYPE})@Retention(value=RetentionPolicy.RUNTIME)public@interfaceComponent{Stringvalue();}实体类@Component("userBean")publicclassUser{}*测试@TestpublicvoidComponentScan()throwsUnsupport......