代码之家  ›  专栏  ›  技术社区  ›  GetFree

php:pcntl_fork()真正做什么?

  •  13
  • GetFree  · 技术社区  · 16 年前

    php的pcntl_fork函数应该像c中的标准fork函数一样分叉一个进程。
    但是我想知道这个函数是否真的分叉了这个过程,或者它是否以不同的方式模拟了这个行为。
    如果它真的分叉了进程,那么很明显哪个进程就是:Apache的子进程之一。
    只要Apache使用的是预处理MPM(即每个请求一个进程),就可以了。
    但是如果Apache使用Worker MPM会发生什么呢??
    当使用辅助MPM时,每个Apache子进程都包含许多线程,每个线程处理不同的HTTP请求。因此,如果您在这种情况下分叉进程,我甚至无法想象所有这些线程和请求都会发生什么。
    因此,如果pcntl_fork()真的分叉了进程,那么我认为如果将apache设置为使用worker mpm,那么使用这个函数不是一个好主意。

    专家们怎么说?我是在推理,还是在胡说八道?

    4 回复  |  直到 10 年前
        1
  •  21
  •   Pascal MARTIN    16 年前

    pcntl_fork 可能按您认为的方式工作:它分叉当前进程,与C函数分叉的方式相同:

    这个 pcntl_fork() 函数创建 不同于 父进程仅在其PID和 PPID。
    请查看您的系统 fork(2) 特定的手册页 关于fork如何在您的 系统。


    但是,引用 Introduction of the Process Control 手册章节:

    PHP中的过程控制支持 实现Unix风格的进程 创建、程序执行、信号 处理和流程终止。
    过程控制不应 在Web服务器中启用 环境和意外结果可能 过程控制时发生 函数在Web服务器中使用 环境。

    因此,实际上不应该从通过Apache执行的PHP脚本中使用该函数:它应该仅在从命令行执行PHP脚本时使用。


    在开始使用这个函数之前,不要忘记:

    注意:此扩展不可用 在Windows平台上。

        2
  •  3
  •   Mohammed H    13 年前

    首先,在为WorkerMPM配置的Apache安装上运行PHP作为模块不是一个好主意,因为PHP不是线程安全的(我认为在PHP手册中也有这样的说明)。

    是的,它应该分叉这个过程。这个 PHP manual 甚至说你应该读 man fork(2) 对于进一步的指令,它可能只是C fork函数的包装器。

    更新 :下面是PHP Worker MPM手册中的相关页面: http://php.net/install.unix.apache2.php

    注意:要构建多线程版本的Apache,目标系统必须支持线程。在这种情况下,PHP也应该使用实验Zend线程安全(ZTS)来构建。在此配置下,并非所有扩展都可用。建议的设置是使用默认的预处理MPM模块构建Apache。

    我还找到了这个页面,还有一些进一步的说明: http://www.stevekallestad.com/blog/apache_worker_mpm_with_php.html

        3
  •  3
  •   Daniel Andres Acevedo    10 年前

    我会尽量简明扼要,

    通过apache使用“fork”是可能的,您需要“安装”,然后在php.ini中启用函数,最后您需要在apache目录中添加扩展(symlink也可以完成这项工作)。 前任:

    echo "extension=pcntl.so" > /etc/php5/conf.d/pcntl.ini
    ln -s /etc/php5/apache2/conf.d/pcntl.ini /etc/php5/mods-available/pcntl.ini 
    

    另一方面,我已经在很多项目中使用了forking,它在优化大多数项目时非常出色,但是,当使用apache时,有一个bug,我基本上是用forking来分配孩子,做任何类型的硬核工作,而且它是有效的……很好,但是在加载下,它在开始创建僵尸进程之前工作了一段时间,我可以使用“pcntl_signal(sigchld,sig_ign);”来管理僵尸进程,它基本上会在孩子完成任务后立即删除进程,这有点帮助,然后当apache变得疯狂时,就开始线程化,最后崩溃。我们的服务器,我还不能解释这个行为(但我会),这个由Apache创建的weir/evil tree只能从“ps”或服务器状态或Apache日志中看到,我说evil tree是因为它基本上创建了数百个进程,其中包含子进程…

    简而言之:

    福克和阿帕奇会合作吗?对。。。绝对地

    只是不要滥用它

    希望这能帮上忙

        4
  •  0
  •   bourneli    14 年前

    我刚刚尝试通过apache使用pcntl_fork,奇怪的情况是,在fork子进程之后,父进程将标准输出(浏览器)提供给它的子进程。所以,您可以图像化,浏览器无法从父进程接收输出。

    推荐文章