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

简介: 本文探讨了PHP流式输出的问题,指出当每次`echo`的内容过短时,前端可能无法实时接收。通过测试发现,需达到一定长度(如1024字节)时流式输出才会生效。为解决此问题,建议在PHP代码中检查输出内容长度,不足时拼接特殊标记,前端接收到后通过正则表达式移除。示例代码提供了解决方案,文章鼓励读者留言讨论和点赞分享。关注作者微信公众号【xdub】获取更多相关内容。

实测得知,如果用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】,欢迎大家订阅,我会同步文章到公众号上。

目录
相关文章
|
3月前
|
前端开发 PHP 数据格式
【附带效果视频】php接口给前端返回流式数据,php使用event-stream进行数据推送,循环一次输出一次
【附带效果视频】php接口给前端返回流式数据,php使用event-stream进行数据推送,循环一次输出一次
99 0
|
关系型数据库 MySQL Linux
百度搜索:蓝易云【Centos8 stream系统编译安装PHP教程。】
以上是在CentOS 8 Stream系统上编译安装PHP的基本教程。请注意,具体的配置和参数可能因您的需求而有所不同,您可以根据自己的情况进行调整。同时,请确保在执行任何操作之前备份重要的文件和配置。
254 0
|
Unix Linux PHP
PHP的流式输入是干什么的?底层原理是什么?
PHP的流式输入是干什么的?底层原理是什么?
193 0
PHP的stream 扩展是干什么的?底层原理是什么?
PHP的stream 扩展是干什么的?底层原理是什么?
132 0
x3d
|
缓存 PHP Memcache
[转] 基于PHP Stream Wrapper开发有趣应用场景
PHP Stream Wrapper 原文:http://blog.sina.com.cn/s/blog_502c8cc40100k40e.html ,主要是基于SAE环境讲述相应的应用场景,本文经过一定的整理和少量补充。
x3d
1022 0
|
PHP Unix 数据安全/隐私保护
php常用Stream函数集介绍
php常用Stream函数集介绍 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-24   本篇文章是对php中的常用Stream函数集进行了详细的分析介绍,需要的朋友参考下     stream_bucket_append函数:为队列添加数据 stream_...
956 0
|
15天前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
25天前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
|
2月前
|
存储 SQL 关系型数据库
PHP与MySQL交互的奥秘
【8月更文挑战第29天】在编程的世界里,PHP和MySQL就像是一对默契的舞伴,共同演绎着数据的交响曲。本文将带你探索它们之间的互动,从连接数据库到执行查询,再到处理结果,每一步都充满了节奏与和谐。我们将一起走进这段代码的旅程,感受数据流动的魅力。
|
2月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。