调用未定义的函数pcntl_fork()php-fpm nginx

时间:2016-01-26 23:40:49

标签: php pcntl

我试图在php-fpm中使用pcntl_fork(),但它不可用,我得到:

Call to undefined function pcntl_fork()

尽管我已经对disable_functions中的php.ini进行了评论。 phpinfo()显示作者,php -m也列出pcntl。如果我从cli执行我的脚本,它会起作用。我还需要启用其他选项吗?

作为MWE,我在https://github.com/white-gecko/pcntl-mwe分别准备了一个最小的码头环境

docker pull whitegecko/pcntl-mwe

如果您使用docker run -it --rm --name pcntl -p 8080:80 pcntl运行它,您将获得http://localhost:8080/处的示例和http://localhost:8080/phpinfo.php处的phpinfo。它是一个debian jessie系统。

1 个答案:

答案 0 :(得分:11)

PCNTL扩展仅限于在CLI中运行;您不能在其他服务器环境中使用它(fpm,mod_php等)。

应该发生的是,标记为“cli”的扩展仅用于静态链接到CLI二进制文件,或允许在CLI中加载共享,并从针对其他SAPI(libphp7.so)的共享版本中省略。 / p>

为PC配置PCNTL的autoconf(ext / pcntl / config.m4)文件应该指示构建过程禁止在其他SAPIS中加载PCNTL,它会发生1)它不是很好2)当FPM合并到PHP时没有考虑到这一点:因此FPM忽略它并且无论如何都链接到PCNTL源(如果扩展在编译时启用),并且其他SAPI将允许您加载库,如果它被共享,因为DSO(共享库)本身不强制实施SAPI限制。这些事情(FPM链接和其他加载)都不应该被允许,强迫不受支持的SAPI加载PCNTL是一个糟糕的想法

当您分叉一个进程时,您创建一个名为fork的进程的写时复制克隆:在Apache或FPM内部,这意味着您可能无法在子进程中正常管理的重复文件(套接字)句柄(对于你无法从PHP访问它们。

这应该限制在CLI(和早期CGI)的原因是这些SAPI使用单一流程模型。虽然FPM在技术上是一个CGI接口,但它肯定不是单一过程,因此永远不会是一个适合在用户土地上分叉的环境。