模块pcntl已在第0行的“未知”中加载-Apache x Cli

时间:2018-09-20 22:24:52

标签: php apache ubuntu pcntl

我收到此PHP警告:

  

模块'pcntl'已在第0行的Unknown中加载

但是仅对Apache启用。在/etc/php/7.2/apache2/conf.d/20-pcntl.ini上启用了它:

  

extension = pcntl.so

我没有在CLI上启用它。已检查:

  • 我没有/etc/php/7.2/cli/conf.d/20-pcntl.ini文件
  • Grep命令grep -R extension=pcntl.so /etc/php/7.2仅返回apache2文件夹中的文件

如果我在Apache的.ini上禁用此扩展名,它将不会在Apache上加载,但会在Cli上加载。

如果在Apache的.ini上启用此扩展名,则会收到模块已加载警告。

我需要在Apache上启用PCNTL才能使用Spatie \ Async库。

这是Ubuntu 14服务器。

2 个答案:

答案 0 :(得分:0)

有时,扩展将编译到PHP 中,而不是作为单独的模块加载。在摆弄PHP.ini文件之前,您可能应该运行一个快速的PHP脚本来查看加载了哪些模块:

<?php
var_dump(get_loaded_extensions());

您还应该注意 disable_functions 之类的PHP指令,这些指令可能会禁用pcntl函数。在我的Ubuntu工作站上,使用以下指令禁用pcntl功能:

/etc/php5/apache2/php.ini:disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

我建议您尝试进行更广泛的grep搜索,以了解pcntl是否在其他地方被提及:

grep -ir pcntl.so /etc/php/7.2
  

我没有/etc/php/7.2/cli/conf.d/20-pcntl.ini文件

对我来说似乎有点奇怪。您可以尝试在其中搜索更多php.ini文件:

sudo find /etc -name "php.ini"

您还应该检查以确保您没有从命令行运行与apache不同的PHP。在某些情况下(令人遗憾的是,您可能会更频繁地发生这种情况),您的CLI PHP与Apache PHP不同。 This article详细讨论了该问题。

  

如果我在Apache的.ini上禁用此扩展名,它将不会在Apache上加载,但会在Cli上加载。

对我来说,这实际上听起来很合理。如果我不得不猜测,我会说明智的Ubuntu / Debian软件包管理人员认为允许pcntl_x函数在apache环境中运行是不明智的,特别是考虑到stark and ancient warning。我不记得该警告现在是否过时。我将向您介绍这个other thread,我问了一些相关问题,并被告知我应该在事件模式下将PHP-FPM与apache一起使用。

所有这些,我在pcntl_fork和posix_setsid之类的PHP中编写“多线程”应用程序(技术上不是多线程,而是多处理)取得了巨大的成功。

总而言之,我猜想PCNTL已经在apache和cli上加载了,明智的Ubuntu开发人员可能禁用了php.ini中的pcntl函数。

答案 1 :(得分:0)

我知道这是原帖发布的很长时间,但是我遇到了类似的问题。我正在使用AWS Linux AMI,并且pnctl似乎已预安装到php-cli中(未通过php.ini加载)

问题是Spatie异步检查您的PHP运行时(PHP-FPM)来查看是否已加载pnctl和posix模块,即使它们在创建时实际上使用的php-cli中默认情况下也不可用Spatie异步池。

我的解决方案是实际修改php-fpm服务以使其与extension=pnctl.so

一起运行
systemctl edit php-fpm

它将在/etc/systemd/system/

中创建替代文件

通过更改来修改文件

ExecStart=/usr/sbin/php-fpm --nodaemonizeExecStart=/usr/sbin/php-fpm -d extension=pctnl.so--nodaemonize并保存

然后重新启动您的nginx和php-fpm服务,并且pnctl对于PHP-FPM应该处于活动状态