我收到此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 -R extension=pcntl.so /etc/php/7.2
仅返回apache2文件夹中的文件如果我在Apache的.ini上禁用此扩展名,它将不会在Apache上加载,但会在Cli上加载。
如果在Apache的.ini上启用此扩展名,则会收到模块已加载警告。
我需要在Apache上启用PCNTL才能使用Spatie \ Async库。
这是Ubuntu 14服务器。
答案 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 --nodaemonize
至ExecStart=/usr/sbin/php-fpm -d extension=pctnl.so--nodaemonize
并保存
然后重新启动您的nginx和php-fpm服务,并且pnctl对于PHP-FPM应该处于活动状态