最近做一个项目,用到了 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 了。
求各位大神解惑或者提供思路。
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 ,就不会出现这个问题 |