我试图在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系统。
答案 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接口,但它肯定不是单一过程,因此永远不会是一个适合在用户土地上分叉的环境。