pcntl fork mysql_【教训】php pcntl_fork无法在web服务器环境下使用

背景

有一个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手册首页第一段,总结一个教训,技术手册不一定要全部看完,但是首页还是得多留意一下,一般都会将重要的信息放在这里,这些信息对是否使用该技术有很大参考价值

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值