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

    参考资料

  • 相关阅读:
    设计模式--单例模式(Singleton)
    C# 和.Net 特性
    Fiddler 教程
    史铁生遗作:昼信基督夜信佛
    如何实现早日退休理想
    Linux 常用
    Golang 读书
    Python 读书
    RbMQ 简介
    UML 简介
  • 原文地址:https://www.cnblogs.com/bourneli/p/2579804.html
Copyright © 2011-2022 走看看