该报错本质是同一扩展被多个.ini文件中的extension=指令重复启用,修复需定位并删除冗余加载项:先用php --ini和grep -r查找冲突文件,再确保基础扩展仅在一个配置中启用,依赖扩展不重复声明,最后php -v验证无警告并重启服务。

PHP扩展重复加载报错(如 PHP Warning: Module 'xxx' already loaded)本质是同一个扩展在多个配置文件中被 extension= 指令重复启用。修复核心是定位并删除冗余加载项,而非修改扩展本身。
一、确认重复加载的扩展名
运行以下命令查看当前已加载的扩展及来源:
php -m
再用带详细信息的方式定位每个扩展的加载位置:
php --ini
输出类似:
立即学习“PHP免费学习笔记(深入)”;
Configuration File (php.ini) Path: /etc/php/8.2/cli<br>Loaded Configuration File: /etc/php/8.2/cli/php.ini<br>Scan for additional .ini files in: /etc/php/8.2/cli/conf.d<br>Additional .ini files parsed: /etc/php/8.2/cli/conf.d/10-opcache.ini,<br> /etc/php/8.2/cli/conf.d/20-mysqlnd.ini,<br> /etc/php/8.2/cli/conf.d/20-pdo_mysql.ini
重点看 Additional .ini files parsed 列出的路径——这些目录下常存在多个 .ini 文件各自启用了同一扩展(例如 pdo.so 在 pdo.ini 和 pdo_mysql.ini 中都被写了 extension=pdo)。
二、检查并清理重复的 extension= 行
进入扫描目录(如 /etc/php/8.2/cli/conf.d/),逐个查看 .ini 文件:
grep -r "extension=" /etc/php/8.2/cli/conf.d/
常见重复场景:
-
pdo.ini含extension=pdo -
pdo_mysql.ini也含extension=pdo(错误!应只写extension=pdo_mysql) -
opcache.ini和php.ini都写了zend_extension=opcache.so
✅ 正确做法:
- 基础扩展(如
pdo,mysqli,curl)只在 一个 .ini 文件中启用 - 依赖型扩展(如
pdo_mysql)无需重复加载pdo,它会自动调用已加载的 PDO 核心 -
zend_extension(如 opcache、xdebug)必须全局唯一,且不能与普通extension混用同一文件名
三、一键检测与清理脚本(推荐保存为 fix_php_ext.sh)
以下 Bash 脚本自动扫描重复加载的扩展名,并列出冲突文件(仅显示,不自动删除,确保安全):
#!/bin/bash<br>PHP_INI_DIR=$(php --ini 2>/dev/null | grep "Scan for additional" | cut -d':' -f2 | xargs)<br>if [ -z "$PHP_INI_DIR" ]; then<br> echo "未找到 conf.d 目录,请手动检查 php --ini 输出"; exit 1<br>fi<br><br>echo "? 扫描目录:$PHP_INI_DIR"<br>echo "================================"<br><br># 提取所有 extension= 和 zend_extension= 行,标准化扩展名<br>find "$PHP_INI_DIR" -name "*.ini" -exec grep -l "extension=" {} \; 2>/dev/null | while read f; do<br> grep -E "^(extension|zend_extension)=" "$f" 2>/dev/null | while read line; do<br> ext=$(echo "$line" | sed -E 's/^(extension|zend_extension)=["'\'']?([^"'\'']+)["'\'']?.*/\2/')<br> if [ -n "$ext" ]; then<br> echo "$f: $line" | sed 's/^[[:space:]]*//'<br> fi<br> done<br>done | sort | awk -F': ' '{print $2}' | sort | uniq -c | awk '$1 > 1 {print $2}' | while read dup; do<br> echo "⚠️ 重复扩展:$dup"<br> find "$PHP_INI_DIR" -name "*.ini" -exec grep -l "$dup" {} \; 2>/dev/null | xargs -I{} sh -c 'echo " → {}"; grep "$dup" {}'<br> echo ""<br>done使用方法:
chmod +x fix_php_ext.sh<br>./fix_php_ext.sh
输出示例:
⚠️ 重复扩展:pdo<br> → /etc/php/8.2/cli/conf.d/pdo.ini<br>extension=pdo<br> → /etc/php/8.2/cli/conf.d/pdo_mysql.ini<br>extension=pdo
→ 手动编辑 pdo_mysql.ini,删掉 extension=pdo 这一行即可。
四、验证修复结果
清理后,执行:
php -v
确认无 Module 'xxx' already loaded 警告;再运行:
php -m | grep -E "^(pdo|mysql|opcache)"
确认所需扩展正常列出,且无重复名称。
重启 PHP-FPM 或 Web 服务器(如 Apache/Nginx)使配置生效:
sudo systemctl restart php8.2-fpm # Ubuntu/Debian<br># 或<br>sudo systemctl restart httpd # CentOS/RHEL



















