我正在尝试使用pcntl_fork()
在 php-fpm 中,但它不可用,我得到:
Call to undefined function pcntl_fork()
尽管我已经评论过了disable_functions
in the php.ini
. phpinfo()
显示作者和php -m
还列出了pcntl
。如果我从 cli 执行脚本,它就会起作用。我还需要启用其他选项吗?
作为 MWE,我准备了一个最小的 docker 环境https://github.com/white-gecko/pcntl-mwe https://github.com/white-gecko/pcntl-mwe resp.
docker pull whitegecko/pcntl-mwe
如果你运行它docker run -it --rm --name pcntl -p 8080:80 pcntl
您将在以下位置找到示例http://localhost:8080/
和 phpinfo 在http://localhost:8080/phpinfo.php
。它是一个 debian jessie 系统。
Answer recommended by
PHP /collectives/php
Collective
PCNTL 扩展仅限于在 CLI 中运行;您不能在其他服务器环境(fpm、mod_php 等)中使用它。
应该发生的情况是,标记为“cli”的扩展仅意味着静态链接到 CLI 二进制文件,或允许在 CLI 中共享加载,并从针对其他 SAPI (libphp7.so) 的共享构建中省略。
为 PHP 配置 PCNTL 的 autoconf (ext/pcntl/config.m4) 文件应该指示构建过程禁止在其他 SAPIS 中加载 PCNTL,碰巧 1) 它不是很好,2) 这不是当 FPM 合并到 PHP 中时考虑到这一点:因此 FPM 会忽略它并与 PCNTL 源链接(如果在编译时启用扩展),并且其他 SAPI 将允许您加载库(如果它是共享的),因为 DSO(共享)库)本身不强制 SAPI 限制。这些事情(FPM 链接和其他加载)都不应该被允许,这是一个糟糕的主意强制不支持的 SAPI 加载 PCNTL。
当您 fork 一个进程时,您会创建一个调用 fork 的进程的写时复制克隆:在 Apache 或 FPM 内部,这意味着您无法在子进程中优雅地管理重复的文件(套接字)句柄(因为您没有从 PHP 访问它们)。
这应该仅限于 CLI(和早期的 CGI)的原因是这些 SAPI 使用单一进程模型。虽然 FPM 从技术上来说是一个 CGI 接口,但它肯定不是单一进程,因此永远不会是在用户空间进行分叉的合适环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)