首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  PHP

PHP built-in Server 中页面执行 pclose(popen())导致页面不能结束

  •  
  •   zdkmygod · 2018-02-11 00:13:06 +08:00 · 946 次点击
    这是一个创建于 466 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做一个项目,用到了 PHP 的异步,即使用 popen 和 pclose 新建一个进程。

    这个问题发生在使用 built-in Server 的时候,某个页面使用 pclose(popen())开启新进程,在该页面代码全部执行完之后,页面迟迟不能结束,直到异步程序执行完毕之后才会结束页面。

    因此我写了两个测试脚本:

    sleep.php

    <?php
    sleep(10);
    

    test.php

    <?php
    pclose(popen('python ./sleep.py  2>&1 &', 'r'));
    

    使用 Chrome network 看到的结果如下:

    Connection Setup		TIME
    Queueing	
    ​
    3.28   ms
    Stalled	
    ​
    2.25   ms
    DNS Lookup	
    ​
    0.01   ms
    Initial connection	
    ​
    0.19   ms
    Request/Response		TIME
    Request sent	
    ​
    0.08   ms
    Waiting (TTFB)	
    ​
    4.39   ms
    Content Download	
    ​
    10.03   s
    Explanation	10.04   s
    

    使用 Apache httpd 就没有这个问题,多番尝试之后,有点怀疑是 built-in Server 的 bug 了。

    求各位大神解惑或者提供思路。

    2 回复  |  直到 2018-02-11 15:13:28 +08:00
        1
    qce7   2018-02-11 11:10:12 +08:00
    根据官方对于 built in server 的说明 ,我来猜测一下
    ```
    This web server was designed to aid application development. It may also be useful for testing purposes or for application demonstrations that are run in controlled environments. It is not intended to be a full-featured web server. It should not be used on a public network.
    ....
    The web server runs a only one single-threaded process, so PHP applications will stall if a request is blocked.
    ```
    本来就不是设计用来做 full-featured web server 的,重点是第 2 段,单线程进程,所以异步的 sleep 把之前请求阻塞了
    如果你换成 python sleep.py ,就不会出现这个问题
        2
    zdkmygod   2018-02-11 15:13:28 +08:00
    @qce7 换成 python sleep.py 有同样的问题,当时就尝试了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1023 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 18:41 · PVG 02:41 · LAX 11:41 · JFK 14:41
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1