gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:11:59 27 4
gpt4 key购买 nike

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

Call to undefined function pcntl_fork()

即使我在 php.ini 中注释掉了 disable_functionsphpinfo() 显示作者,php -m 还列出 pcntl。如果我从 cli 执行我的脚本,它就可以工作。我需要启用任何其他选项吗?

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

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 系统。

最佳答案

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 接口(interface),但它肯定不是单一进程,因此永远不是适合在用户领域进行 fork 的环境。

关于php - 调用未定义函数 pcntl_fork() php-fpm nginx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35026153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com