V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lysS
V2EX  ›  问与答

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

  •  
  •   lysS · Nov 24, 2019 · 3552 views
    This topic created in 2346 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
        1
    hahasong  
       Nov 24, 2019 via iPhone
    前端你不了解 http 吗,想实现你的要求得在命令行下执行
    815979670
        2
    815979670  
       Nov 24, 2019 via Android
    cli 模式不是这样的
    also24
        3
    also24  
       Nov 24, 2019
    缓冲区的原因,强制 flush 可解
    optional
        4
    optional  
       Nov 24, 2019 via iPhone
    可以 flush 的
    dobelee
        5
    dobelee  
       Nov 24, 2019 via iPhone
    请先学习一下 http。。。
    nvkou
        6
    nvkou  
       Nov 24, 2019 via Android
    楼上说明了。php-cli 也是有的,之前试过用来做 ws 服务器
    otakustay
        7
    otakustay  
       Nov 24, 2019
    不是,这和 HTTP 啥关系,HTTP 哪里规定了要一起输出的,楼上几位让楼主学 HTTP 的是几个意思,学歪吗?
    holdmycosmo
        8
    holdmycosmo  
       Nov 24, 2019
    http 还能一次请求,给俩响应?你请求一次,还能先返回'钱钱钱钱',然后等 10 秒,再返回'啊啊啊啊啊'?
    Trim21
        9
    Trim21  
       Nov 24, 2019 via Android
    这跟 http 有啥关系,http 里面一个请求也可以先返回一部分,再等十秒再返回另一部分啊,不关闭链接 body 分两次写不就行了吗。

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