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

whi*_*cko 7 php pcntl

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

Call to undefined function pcntl_fork()
Run Code Online (Sandbox Code Playgroud)

即使我已经在评论disable_functions中表达了评论php.ini.phpinfo()显示作者和php -m列表pcntl.如果我正在从cli执行我的脚本,它可以工作.我还需要启用其他选项吗?

作为MWE,我在https://github.com/white-gecko/pcntl-mwe resp上准备了一个最小的docker环境.

docker pull whitegecko/pcntl-mwe
Run Code Online (Sandbox Code Playgroud)

如果你用它运行它将docker run -it --rm --name pcntl -p 8080:80 pcntl有例子http://localhost:8080/和phpinfo at http://localhost:8080/phpinfo.php.它是一个debian jessie系统.

Joe*_*ins 12

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

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

配置PCNTL for PHP的autoconf(ext/pcntl/config.m4)文件应该指示构建过程禁止在其他SAPIS中加载PCNTL,它恰好发生1)它不是很好2)这不是当FPM合并到PHP时考虑到:因此FPM忽略它并且无论如何都链接到PCNTL源(如果在编译时启用扩展),并且如果由于DSO(共享)而共享库,则其他SAPI将允许您加载库library)本身不强制执行SAPI限制.应该允许这些事情(FPM链接和其他加载),强制不支持的SAPI加载PCNTL 是一个可怕的想法.

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

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