Sodium扩展在PHP 8.1中默认内置但需满足两个前提:系统已安装libsodium运行时库且PHP编译时启用--with-sodium;验证是否真正可用应使用php -r "var_dump(function_exists('sodium_crypto_secretbox'));",返回bool(true)才表示函数可用。

sodium 扩展在 PHP 8.1 中**默认已内置**,但必须满足两个前提:系统已安装 libsodium 运行时库,且 PHP 编译时启用了 --with-sodium。很多生产环境(尤其是容器、国产 OS 或自编译 PHP)会漏掉这一步,导致函数如 sodium_crypto_secretbox() 直接报错 “undefined function”。
确认 PHP 是否真支持 sodium
别只看php -m | grep sodium —— 它可能显示模块名,但实际函数不可用。更可靠的验证方式是:
php -r "var_dump(function_exists('sodium_crypto_secretbox'));"
bool(true) 才算真正可用。如果为 false,说明扩展未生效,常见原因有:
- PHP 是源码编译安装,但没加
--with-sodium参数 - 系统缺少
libsodium库(不是开发包),运行时找不到符号 - 宝塔等面板启用了多版本 PHP,但你改的是旧版本的
php.ini
Ubuntu/Debian 系统:装 libsodium 运行时 + 开启扩展
PHP 8.1 在 Ubuntu 22.04+ 默认已启用sodium,但仍需确保底层库存在:
sudo apt update && sudo apt install libsodium23 -y
libsodium-dev(那是编译用的),生产环境只需 libsodium23。装完后检查:
ldconfig -p | grep sodium
libsodium.so.23 的条目。接着确认扩展是否已加载:
php --ini
立即学习“PHP免费学习笔记(深入)”;
找到加载的php.ini 路径,打开它,搜索 sodium。如果没启用,添加一行:
extension=sodium
CentOS/RHEL/AlmaLinux:libsodium-devel ≠ libsodium 运行时
很多人误以为装了libsodium-devel 就够了,其实它只提供头文件,不提供 .so 运行时库。必须额外安装运行时:
sudo dnf install libsodium -y
yum install libsodium,但注意 EPEL 源需先启用)
验证方式同上:ldconfig -p | grep sodium 必须看到 libsodium.so.23 或类似版本。若仍报错,检查 PHP 是否为 SCL(Software Collections)安装,其 php.ini 路径通常在 /etc/opt/rh/php81/php.ini,而非 /etc/php.ini。
宝塔 / 自编译 PHP 8.1:手动启用 sodium.so 的坑
宝塔 PHP 7.4+ 多数已内置sodium,但部分用户升级 PHP 后未重载配置。若 phpinfo() 页面里看不到 sodium 模块:
- 先执行
php -m | grep sodium,如果无输出,说明未启用 - 进入对应 PHP 版本的配置目录,例如
/www/server/php/81/etc/php.ini - 在文件末尾添加
extension=sodium(不是sodium.so,PHP 8.0+ 支持短名) - 切勿写成
extension=/www/server/php/81/lib/php/extensions/.../sodium.so—— 路径易错,且 PHP 8.1 会自动定位 - 重启 PHP 服务后,检查错误日志:
tail -f /www/server/php/81/var/log/php-fpm.log,若出现failed to open stream: No such file or directory,说明路径写死了且错了
extension=sodium,让 PHP 自动加载。
真正卡住人的地方,往往不是“怎么装”,而是“装了但函数不存在”——根源几乎都在 libsodium 运行时库缺失或 PHP 编译时未链接它。验证一定要落到 function_exists() 这一层,而不是只看模块列表。



















