简介

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

本文档旨在解释每个进程控制函数的一般用法。有关 Unix 进程控制的详细信息,建议您查阅系统文档,包括 fork(2)、waitpid(2) 和 signal(2),或参考 W. Richard Stevens 编著的《Unix 环境高级编程》(Addison-Wesley)。

PCNTL 现在使用滴答作为信号处理回调机制,这比以前的方法快得多。这种改变遵循与使用“用户滴答”相同的语义。您使用 declare() 语句来指定程序中允许发生回调的位置。这使您可以最大程度地减少处理异步事件的开销。在过去,使用 pcntl 启用 PHP 编译将始终产生这种开销,无论您的脚本是否实际上使用了 pcntl。

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

添加注释

用户贡献的注释 3 个注释

sean dot kelly at mediatile dot com
12 年前
以下陈述让我寻找了大约一天的答案,然后我才终于明白了

"进程控制不应在 Web 服务器环境中启用,如果在 Web 服务器环境中使用任何进程控制函数,可能会出现意外结果."

至少对于我正在使用的 PHP 5.3.8,以及谁知道它有多久,这不仅仅是“不应”,而是“不能”。即使我已经使用 --enable-pcntl 编译了 PCNTL,事实证明它只编译到 PHP 的 CLI 版本中,而不是 Apache 模块。因此,我花费了数小时试图找出为什么 function_exists('pcntl_fork') 返回 false,即使它编译正确。事实证明,它从 CLI 返回 true,并且仅对 HTTP 请求返回 false。所有 pcntl_*() 函数都是如此。
InvisibleSmiley
3 年前
pcntl 函数的禁用不仅影响 Apache 服务器,还影响任何非 CLI 设置,例如带有 PHP-FPM 的 nginx。

您可以通过发出 phpinfo() 并查看输出的核心部分中的“disable_functions”来判断。

还值得注意的是,当您在命名空间上下文中调用 pcntl 函数时,这种行为可能会非常具有误导性。例如,您可能会得到

"调用未定义函数 some\custom\namespace\pcntl_signal()"

当从命名空间类中的方法调用 pcntl_signal 时。您的第一个本能可能是添加一个前导反斜杠,但这并不能解决问题。您需要在运行时检查该函数是否存在,除非代码仅从 CLI 执行。
Rick Sustek
8 年前
实际上,进程控制功能在 Apache 模块中不受支持的原因非常合理。Apache HTTP 服务器是主要进程。当由请求的资源(例如 http://foo.php)引导到 PHP 时,它会调用 PHP 模块。它调用 PHP 模块,通常在一个新的线程或一个池化的线程上。然后 PHP 模块运行您的脚本,但 Apache 服务器仍然是拥有进程。

在此执行模型中,您的 PHP 脚本的工作通常是尽快完成它的工作并返回。这使得 Apache 守护程序能够在您借用的线程上做其他有用的事情。是的,有些脚本比其他脚本花费更长的时间来完成任务,但阻塞线程很长时间通常是不可取的。

如果您的脚本被允许弄乱正在运行进程的信号处理程序,它就会弄乱 Apache 守护程序本身!该守护程序已经为其自身使用安装了信号处理程序。在这种情况 下,不允许进程控制操作非常有道理。
To Top