【教训】php pcntl_fork无法在web服务器环境下使用
2012-07-06 17:50
337 查看
背景
有一个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手册首页第一段,总结一个教训,技术手册不一定要全部看完,但是首页还是得多留意一下,一般都会将重要的信息放在这里,这些信息对是否使用该技术有很大参考价值
参考资料
PHP手册:http://php.net/manual/en/intro.pcntl.php
stackOverflow:http://stackoverflow.com/questions/2038586/php-what-does-pcntl-fork-really-do/11358972
有一个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手册首页第一段,总结一个教训,技术手册不一定要全部看完,但是首页还是得多留意一下,一般都会将重要的信息放在这里,这些信息对是否使用该技术有很大参考价值
参考资料
PHP手册:http://php.net/manual/en/intro.pcntl.php
stackOverflow:http://stackoverflow.com/questions/2038586/php-what-does-pcntl-fork-really-do/11358972
相关文章推荐
- PHP pcntl_fork不能在web服务器中使用的变通方法
- 手把手教你在centos下编译安装配置高性能web服务器环境nginx+php(fast-cgi)+mysql等/适合小内存vps使用
- 手把手教你在centos下编译安装配置高性能web服务器环境nginx+php(fast-cgi)+mysql等/适合小内存vps使用
- 树莓派 搭建web服务器无法解析php网页
- 手把手教你在centos下编译安装配置高性能web服务器环境nginx+php(fast-cg...
- Android使用KSWEB搭建HTTP/WEB服务器环境
- 使用SecureCRTP 连接生产环境的web服务器和数据库服务器
- Windows环境下用Apache+PHP+MySql配置web服务器
- 解决服务器外网无法访问,PHPWAMP端口扫描工具的使用
- 使用OSS JavaScript的sdk进行web端直传,开发环境下测试没有问题,但部署到服务器上或者打包到IOS原生包中出现了问题。
- 使用 cacti 批量监控服务器以及其 PHP 运作环境配置
- 阿里云服务器cent0S安装web环境PHP+MySql+Nginx,给nginx添加网站
- 在一个服务器上搭建好php环境,在服务器上可以访问,其他机器可以访问服务器但网页无法访问
- 韩顺平PHP学习视频笔记整理029apache服务器使用及配置④ apache虚拟主机 web访问时序图
- USBWebServer 中文便携版 快速搭建 PHP/MySQL 网站服务器环境
- PHP+Apache+MySQL经典搭配,创建环境二 Apache Web服务器安装(转载并修改)
- 无法启动Visual Studio的localhost web服务器,端口"xxxx"已被使用
- php使用socket post数据到其它web服务器的方法
- 17-阿里云服务器ECS使用教程之Web环境的搭建
- MyEclipse6.5中搭建Web环境(使用Tomcat6.0服务器)