PHP扩展不生效的首要原因是改错了php.ini文件,需分别用php --ini和phpinfo()确认CLI与Web环境实际加载的配置路径,二者常不同。

php.ini 里 extension=xxx.so 不生效?先确认 PHP 实际加载的配置文件
PHP 加载扩展失败,八成是因为改错了 php.ini —— 你本地可能有多个配置文件,CLI 和 Web(如 Apache/Nginx)用的还不是同一个。
- 运行
php --ini查 CLI 用的 ini 路径; - 在 Web 环境中建个
info.php,写<?php phpinfo(); ?>,浏览器打开看 “Loaded Configuration File” 行; - 别直接改系统默认的
/etc/php/*/cli/php.ini,除非你确定 CLI 是目标环境; - Windows 下注意路径分隔符是反斜杠,但
extension=php_curl.dll里不用写完整路径,只写文件名即可(前提是extension_dir正确)。
Linux 下 .so 扩展找不到依赖库?ldd 是第一排查工具
扩展编译成功、extension= 也加了,但 php -m 不显示,或启动时报 undefined symbol,大概率是动态链接失败。
- 先定位扩展文件位置:
find /usr -name "redis.so" 2>/dev/null; - 用
ldd /path/to/redis.so检查缺失的 so(常见如libicu、libsodium); - 缺啥装啥,比如 Ubuntu 上
apt install libicu-dev后,可能还需sudo ldconfig刷新缓存; - 别手动拷贝
.so到extension_dir目录就完事——它可能依赖其他未被加载的扩展(如json是很多扩展的基础依赖,必须提前启用)。
Windows 下 extension=php_opcache.dll 总被忽略?检查线程安全(TS)和架构匹配
Windows 版 PHP 分 TS(Thread Safe)和 NTS(Non-Thread-Safe),扩展必须严格匹配,否则加载无声失败。
- 运行
php -v,末尾括号里会写TS或NTS; - 去官网下载对应版本的扩展包(比如 PHP 8.2 VC17 TS → 下载
php_opcache-8.2-vc17-ts-x64.zip); -
extension_dir在php.ini中要写绝对路径,且结尾带反斜杠:extension_dir = "C:\php\ext\"; - OPcache 必须放在所有其他扩展之前启用(因它影响字节码加载),顺序错会导致部分扩展失效。
用 pecl install 安装扩展后仍不显示?别漏掉 configure 参数和重启环节
pecl install redis 看似成功,但实际可能只是编译完了,没写进 php.ini,或没触发重载。
立即学习“PHP免费学习笔记(深入)”;
- PECL 安装完成后,终端会输出类似
extension=redis的行,**必须手动复制粘贴到 php.ini 对应位置**(不是自动添加); - 某些扩展(如
yaml)需要额外参数:pecl install yaml-2.2.3 --configureoptions 'with-yaml=/usr'; - CLI 下改完 ini,执行
php -m | grep redis验证;Web 下必须重启 Web 服务(sudo systemctl restart apache2或sudo nginx -s reload),光刷新页面没用; - 如果扩展依赖外部 C 库(如
pdo_pgsql依赖libpq),pecl install不会帮你装系统依赖,得先apt install libpq-dev。
最麻烦的不是“怎么加”,而是“加完到底有没有真正加载”——php -m 看列表、php --ri extension_name 看详细信息、phpinfo() 搜关键词,三者结果不一致时,说明环境割裂了。这种问题没法靠一次操作解决,得一层层剥开 PHP 的加载链。











