背景
有一个php的CGI,在处理请求时,需要到其它10台左右的服务器上拉取数据(方式一样,只是服务器IP不同),进行展示。如果使用串行执行,由于网络延时,必然导致每一次http响应事件较长,经实践证明,需要7~10秒左右的时间,用户体验很差。所以,如果能够采用并行,应该会大大减少响应时间。在网上查找相关资料,决定采用php提供的pcntl_fork + 管道的方式实现并行数据拉取与同步。经实践证明,改成并行后,只需要不到2秒的时间,就可以完成所有数据的拉取,但是却无法将这些数据返回给浏览器(用了等于白用L)。
原因
PHP的多进程函数(pcntl_*系列函数)通过apache执行,其结果很诡异,竟然将标准输出(浏览器)给到fork出的子进程,导致主进程无任何输出,浏览器无法接收来自主进程的数据。寻找相关资料,发现php手册上有如下解释:
Process Control support in PHP implements the Unix style of process creation, program execution, signal handling and process termination. Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.
我的神呀,原来手册上已经写得这么清楚了
P.S.:上面这句话在pnctl手册首页第一段,总结一个教训,技术手册不一定要全部看完,但是首页还是得多留意一下,一般都会将重要的信息放在这里,这些信息对是否使用该技术有很大参考价值
参考资料