我试图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接口,但它肯定不是单一过程,因此永远不会成为用户土地分叉的合适环境.
| 归档时间: |
|
| 查看次数: |
3026 次 |
| 最近记录: |