
PHP 扩展没生效?先看 phpinfo() 里有没有
宝塔面板里点“软件商店→PHP→设置→配置文件”,改完 php.ini 不代表扩展就加载成功了。最直接的验证方式是临时加个 phpinfo() 页面:在网站根目录新建 info.php,内容只写 <?php phpinfo(); ?>,然后浏览器访问 /info.php,用 Ctrl+F 搜你要的扩展名(比如 redis、gd、opcache)。如果搜不到,说明没加载;如果搜到了但状态是 disabled,可能是被 disable_functions 或 extension_dir 路径搞错了。
宝塔里装扩展,别乱点“安装”按钮
宝塔 PHP 管理页的“安装扩展”列表只是预编译好的常用模块,它背后调用的是系统包管理器或源码编译脚本。不是所有扩展都支持一键安装,比如 swoole 4.8+、protobuf 或某些带依赖的 C 扩展,点“安装”会卡住或报错 configure: error: not found。这时候得切到终端手动操作:
- 确认当前 PHP 版本路径:
which php和php-config --prefix - 用宝塔自带的
pecl(路径通常是/www/server/php/80/bin/pecl)安装,而不是系统默认的pecl - 安装时指定 PHP 配置路径:
/www/server/php/80/bin/pecl install redis,再手动把生成的redis.so路径写进php.ini
extension=xxx.so 写对位置,比写对名字还关键
宝塔 PHP 设置页里“配置修改”打开的 php.ini 是主配置,但部分扩展(尤其是通过 pecl 安装的)会被自动写进 /www/server/php/80/etc/php.d/ 下的独立 ini 文件。如果你手动加了 extension=redis.so 到主 php.ini,又忘了删掉同名的 redis.ini,PHP 启动时会报 Unable to load dynamic library 'redis.so' —— 因为它被重复加载两次,第二次找不到符号。检查方法很简单:php --ini 看加载了哪些 ini 文件,再用 grep extension /www/server/php/80/etc/php.d/*.ini 扫一遍有没有冲突。
重启服务前,先 php -m | grep xxx 验证
宝塔面板点“重载配置”不等于 PHP-FPM 进程真的重新读了 ini。有些扩展(比如 opcache)需要完整重启 PHP 服务才能生效;而 gd、mbstring 这类基础扩展,可能只需要 reload。更稳妥的做法是终端执行:php -m | grep redis(替换成你要查的扩展名)。如果返回空,说明 CLI 模式都没加载,Web 模式肯定也不行。这时别急着重启面板或服务器,先检查 php -i | grep extension_dir 输出的路径下是否存在对应 .so 文件,以及权限是否为 root:root 且可读(宝塔 PHP 进程通常以 www 用户运行,但加载扩展时需要读取权限)。
立即学习“PHP免费学习笔记(深入)”;
扩展能不能用,不取决于宝塔界面上有没有勾选,而取决于 php -m 的输出和 phpinfo() 里的实际状态。路径、权限、加载顺序、CLI 与 FPM 配置分离——这些细节藏在界面背后,一不留神就白折腾半小时。



















