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

2018-02-11 00:13:06 +08:00
 zdkmygod

最近做一个项目,用到了 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 了。

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

2496 次点击
所在节点    PHP
2 条回复
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 ,就不会出现这个问题
zdkmygod
2018-02-11 15:13:28 +08:00
@qce7 换成 python sleep.py 有同样的问题,当时就尝试了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/430086

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX