V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lysS
V2EX  ›  问与答

PHP 的输出为啥是程序执行完成后再一起输出??

  •  
  •   lysS · 2019-11-24 11:15:20 +08:00 · 3136 次点击
    这是一个创建于 1830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端了解下后端,学了些 php,如下代码:

    <?php
    echo "钱钱钱钱";
    sleep(10);
    echo '啊啊啊啊啊';
    ?>
    


    它不是先输出钱,而是延迟 10 秒后,钱和啊一起输出。

    py 它就是先输出钱,延时后再输出啊

    所以各位巨大有什么解决办法吗

    第 1 条附言  ·  2020-05-21 19:00:11 +08:00
    看下面有的是直接在命令行了运行的, 命令行直接是依次输出的; 我的情况是使用浏览器访问才能复现
    20 条回复    2019-12-03 17:40:06 +08:00
    hahasong
        1
    hahasong  
       2019-11-24 11:23:43 +08:00 via iPhone
    前端你不了解 http 吗,想实现你的要求得在命令行下执行
    815979670
        2
    815979670  
       2019-11-24 11:24:53 +08:00 via Android
    cli 模式不是这样的
    also24
        3
    also24  
       2019-11-24 11:28:08 +08:00
    缓冲区的原因,强制 flush 可解
    optional
        4
    optional  
       2019-11-24 11:35:05 +08:00 via iPhone
    可以 flush 的
    dobelee
        5
    dobelee  
       2019-11-24 12:23:51 +08:00 via iPhone
    请先学习一下 http。。。
    nvkou
        6
    nvkou  
       2019-11-24 12:28:03 +08:00 via Android
    楼上说明了。php-cli 也是有的,之前试过用来做 ws 服务器
    otakustay
        7
    otakustay  
       2019-11-24 14:02:13 +08:00
    不是,这和 HTTP 啥关系,HTTP 哪里规定了要一起输出的,楼上几位让楼主学 HTTP 的是几个意思,学歪吗?
    worldtongfb
        8
    worldtongfb  
       2019-11-24 14:30:22 +08:00
    http 还能一次请求,给俩响应?你请求一次,还能先返回'钱钱钱钱',然后等 10 秒,再返回'啊啊啊啊啊'?
    Trim21
        9
    Trim21  
       2019-11-24 14:36:59 +08:00 via Android
    这跟 http 有啥关系,http 里面一个请求也可以先返回一部分,再等十秒再返回另一部分啊,不关闭链接 body 分两次写不就行了吗。

    php 能不能做到是另一回事,可 http 又不管你服务器是边渲染边返回还是渲染完了才开始响应。
    lysS
        10
    lysS  
    OP
       2019-11-24 15:28:20 +08:00
    lysS
        11
    lysS  
    OP
       2019-11-24 15:29:45 +08:00
    这跟 HTTP 好像确实没关系,因为是这跟 HTTP 好像确实没关系,因为是一次请求
    dorentus
        12
    dorentus  
       2019-11-24 17:34:05 +08:00 via iPhone
    @worldtongfb 当然可以的
    CEBBCAT
        13
    CEBBCAT  
       2019-11-24 19:06:29 +08:00 via Android
    设置响应头为流模式应该可解
    python
        14
    python  
       2019-11-24 19:22:23 +08:00 via Android
    想一下下载文件,就知跟 HTTP 没关系。
    yEhwG10ZJa83067x
        15
    yEhwG10ZJa83067x  
       2019-11-24 19:42:38 +08:00
    @lysS
    我试了下就是线输出钱再过 10 秒输出啊。。。
    环境:php 7.3.11
    服务器:php 内置服务器
    没有出现楼主的情况啊。楼上一群人都是试过了吗?
    yEhwG10ZJa83067x
        16
    yEhwG10ZJa83067x  
       2019-11-24 19:51:57 +08:00
    5200
        17
    5200  
       2019-11-25 11:57:33 +08:00
    ```
    //header('X-Accel-Buffering: no');
    if (ob_get_level() == 0) ob_start();
    for ($i = 0; $i<30; $i++){
    echo "<br> Line to show.";
    echo str_pad('',4096)."\n";
    echo date('Y-m-d H:i:s')."\n";
    ob_flush();
    flush();
    sleep(1);
    }

    echo "Done.";
    ob_end_flush();
    ```

    ![image.png]( https://i.loli.net/2019/11/25/AaSfOzWlDMZgpwo.png)

    如果是用 Apache,可以直接每秒输出一条记录 。
    如果是 nginx 作为 web 服务器时,就需要加上
    header('X-Accel-Buffering: no');
    julyclyde
        18
    julyclyde  
       2019-11-25 15:44:52 +08:00
    @otakustay 如果 http 选“非 chunked”模式,那就必须一次性输出
    otakustay
        19
    otakustay  
       2019-11-25 16:20:27 +08:00
    @julyclyde 这是对的,但问题是 http 很容易选 chunked 模式啊……即使 PHP 不是 chunk,前面的 nginx 可能也给你 chunk 掉了
    lysS
        20
    lysS  
    OP
       2019-12-03 17:40:06 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2922 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:09 · PVG 23:09 · LAX 07:09 · JFK 10:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.