根本原因是mcrypt在PHP 7.2中被正式移除、7.3+完全不可用,phpMyAdmin旧版本(≤4.8.x)因依赖其AES加密功能而报错,但4.9+已切换至openssl实现。
PHP 7.2+ 报 mcrypt 扩展缺失,根本原因是什么
mcrypt 在 php 7.2 中被正式移除,7.3+ 完全不可用。phpmyadmin 检测到它不存在时会弹出警告,但实际多数功能仍可运行——这个提示本质是「向后兼容检查残留」,不是致命错误。真正影响的是旧版 phpmyadmin(≤ 4.8.x)里某些加密相关操作,比如 aes 加密导出、部分配置加密字段。
常见错误现象包括:
- 登录 phpMyAdmin 后顶部黄色横幅提示「The mcrypt extension is missing」
- 尝试使用「导出 → 加密 → AES」时按钮灰掉或报错
- phpinfo() 中查不到 mcrypt 模块,且 extension=mcrypt.so 加载失败
phpMyAdmin 4.9+ 已默认弃用 mcrypt,优先升级而非硬补
新版 phpMyAdmin(4.9.0 起)彻底切换到 openssl 实现对称加密,不再依赖 mcrypt。如果你还在用 4.8.x 或更早版本,升级是最稳妥解法:
- 确认当前版本:
grep -o 'PMA_VERSION.*' /path/to/phpmyadmin/libraries/Config.class.php - 下载最新稳定版(如 5.2.x),注意 PHP 版本兼容性(5.2.x 要求 PHP ≥ 7.2.5)
- 备份原有
config.inc.php,替换文件后重设权限:chown -R www-data:www-data . - 删掉所有
mcrypt相关配置(如extension=mcrypt.so、extension=php_mcrypt.dll),避免 PHP 启动报错
实在不能升级?用 openssl 手动替代 mcrypt_encrypt 类调用
仅当维护遗留系统、无法升级 phpMyAdmin 时才考虑此路。核心是把旧代码中类似这样的调用:
mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv)
换成等效的 openssl_encrypt:
openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv)
关键差异点:
- mcrypt 的 MCRYPT_RIJNDAEL_128 对应 openssl 的 AES-128-CBC(不是 rijndael-128-cbc)
- mcrypt 默认补位为 zero-padding,openssl_encrypt 默认 PKCS#7;若需兼容旧数据,得手动补零并传 OPENSSL_ZERO_PADDING
- IV 长度必须严格匹配:AES 是 16 字节,mcrypt 允许短 IV 自动填充,openssl 会直接报错
Linux 下强行装 mcrypt 的坑远多于收益
有人尝试编译安装 mcrypt 扩展以“修复”提示,但实际会触发一连串问题:
立即学习“PHP免费学习笔记(深入)”;
- PHP ≥ 7.3 编译会失败,因内部 API 已删除
mcrypt相关符号 - Debian/Ubuntu 从 buster 起官方源已移除
php-mcrypt包,apt install 会 404 - 即使降级 PHP 或用第三方 repo 装上,也会和
openssl扩展冲突,导致php -v报段错误 - 安全审计工具(如 Lynis)会将启用
mcrypt标记为高危,因其已多年无维护、存在已知 CVE
phpMyAdmin 的 mcrypt 提示本质是个过期的健康检查项,不是运行门槛。真正该花时间的地方,是确认你用的版本是否支持当前 PHP,以及导出加密这类边缘功能是否真被业务依赖——很多时候,关掉那个提示比修它更省事。



















