lysS
V2EX  ›  问与答

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

  •  
  •   lysS · Nov 24, 2019 · 3906 views
    This topic created in 2540 days ago, the information mentioned may be changed or developed.

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

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


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

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

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

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

    php 能不能做到是另一回事,可 http 又不管你服务器是边渲染边返回还是渲染完了才开始响应。
    lysS
    lysS
    OP
    Nov 24, 2019
    10
    lysS
    lysS
    OP
    Nov 24, 2019
    11
    这跟 HTTP 好像确实没关系,因为是这跟 HTTP 好像确实没关系,因为是一次请求
    dorentus
    dorentus
    Nov 24, 2019 via iPhone
    12
    @worldtongfb 当然可以的
    CEBBCAT
    CEBBCAT
    Nov 24, 2019 via Android
    13
    设置响应头为流模式应该可解
    python
    python
    Nov 24, 2019 via Android
    14
    想一下下载文件,就知跟 HTTP 没关系。
    yEhwG10ZJa83067x
    yEhwG10ZJa83067x
    Nov 24, 2019
    15
    @lysS
    我试了下就是线输出钱再过 10 秒输出啊。。。
    环境:php 7.3.11
    服务器:php 内置服务器
    没有出现楼主的情况啊。楼上一群人都是试过了吗?
    5200
    5200
    Nov 25, 2019
    17
    ```
    //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
    julyclyde
    Nov 25, 2019
    18
    @otakustay 如果 http 选“非 chunked”模式,那就必须一次性输出
    otakustay
    otakustay
    Nov 25, 2019
    19
    @julyclyde 这是对的,但问题是 http 很容易选 chunked 模式啊……即使 PHP 不是 chunk,前面的 nginx 可能也给你 chunk 掉了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1837 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 09:36 · PVG 17:36 · LAX 01:36 · JFK 04:36
    ♥ Do have faith in what you're doing.