Ubuntu 20下安装PHP 7.4 PCNTL扩展报错求助
PHP 7.4 PCNTL扩展编译错误及加载失败排查与解决
问题原因分析
- 编译错误根源:
编译时出现的void value not ignored as it ought to be错误,是因为系统环境中zend_sigaction函数定义为返回void,但PHP PCNTL源码中尝试将其返回值与0做比较,二者不匹配导致编译失败。这种情况通常由系统libc版本、信号处理函数实现差异,或下载的PHP源码与当前系统安装的PHP版本/配置不兼容引发。 - 启动警告原因:
编译未成功生成pcntl.so动态库文件,导致PHP启动时无法找到并加载扩展,因此抛出警告。
解决办法
方法1:通过系统包管理器安装(推荐)
手动编译容易出现环境兼容问题,优先使用系统自带包管理器安装,步骤如下:
- Debian/Ubuntu 系统:
sudo apt-get install php7.4-pcntl - RHEL/CentOS 系统:
sudo yum install php74-php-pcntl
安装完成后重启PHP CLI或FPM服务即可生效。
方法2:修复手动编译问题
若必须手动编译,按以下步骤调整:
- 确认源码版本匹配
执行php -v查看当前PHP精确版本,确保下载的PHP源码包版本与之一致(如均为7.4.33),避免小版本差异导致的兼容问题。 - 修改PCNTL源码逻辑
打开php-7.4.33/ext/pcntl/php_signal.c文件,定位到第53行:
将其替换为:if (zend_sigaction(signo, &act, &oact) < 0) {
由于zend_sigaction(signo, &act, &oact); if (errno != 0) {zend_sigaction在当前系统中无返回值,改用errno判断函数执行是否失败。 - 重新编译安装
sudo make clean sudo make && sudo make install - 启用扩展
编辑PHP的php.ini配置文件,添加或确保存在以下内容:
执行extension=pcntl.sophp -m命令,检查输出中是否包含pcntl,确认扩展加载成功。
方法3:补齐编译依赖
确保系统安装了PHP编译所需的基础依赖:
- Debian/Ubuntu 系统:
sudo apt-get install build-essential php7.4-dev libssl-dev - RHEL/CentOS 系统:
sudo yum install gcc gcc-c++ php74-devel openssl-devel
重要注意事项
- PCNTL扩展仅支持PHP CLI模式,无法在FPM或Web服务器环境中使用,
spatie/async本身是基于CLI的异步工具,请勿在Web环境中尝试使用。 - 手动编译前,可执行
php-config --configure-options查看当前PHP的编译参数,编译时尽量保持配置一致,减少兼容问题。
内容的提问来源于stack exchange,提问作者Hemant Kumar
相关产品推荐
相关产品推荐

