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

调用未定义的函数pcntl_fork()php fpm nginx,php,pcntl,Php,Pcntl,我试图在php fpm中使用pcntl_fork(),但它不可用,我得到: Call to undefined function pcntl_fork() 尽管我已经注释掉了php.ini中的disable\u函数phpinfo()显示作者,php-m还列出了pcntl。如果我正在从cli执行脚本,它会工作。我还需要启用其他选项吗 作为MWE,我在resp准备了一个最小的docker环境 如果您使用docker run-it--rm--name pcntl-p 8080:80 pcntl运行它

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

Call to undefined function pcntl_fork()
尽管我已经注释掉了
php.ini
中的
disable\u函数
phpinfo()
显示作者,
php-m
还列出了
pcntl
。如果我正在从cli执行脚本,它会工作。我还需要启用其他选项吗

作为MWE,我在resp准备了一个最小的docker环境


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

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

应该发生的是,仅标记为“cli”的扩展意味着静态链接到cli二进制文件,或者允许在cli中加载共享,并从针对其他SAPI的共享构建中省略(libphp7.so)

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

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


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

感谢您的澄清。事实上,扩展实际上并不阻止在非cli SAPI中加载。这是不正确的。与p一起使用它是可能的再次阅读hp-fpm…我说这是可能的,并解释了为什么可能,但也说这是一个糟糕的想法…这并不是非常普遍,但在userland服务器场景中非常有用,当您想要立即响应ajax请求(或类似请求),但让某些事情继续进行
docker pull whitegecko/pcntl-mwe