PHP添加扩展需先确认安装方式和运行模式,再匹配扩展类型与路径,修改对应php.ini并重启服务,否则易报错或不生效。
PHP 添加扩展模块不是改个配置就能生效的事,得看扩展类型(编译时内置、动态加载、PECL 安装)、PHP 运行模式(CLI / FPM / Apache 模块)以及你的环境是源码编译还是包管理器安装(如 apt / yum / brew)。直接改 php.ini 加 extension=xxx.so 很可能报错或不生效。
不同安装方式的扩展存放位置、启用机制完全不同:
apt install php-mysql:扩展已预编译,只需启用对应 .ini 文件(如 /etc/php/8.2/cli/conf.d/20-mysql.ini),不用手动找 .so
brew install php:扩展默认装在 /opt/homebrew/lib/php/pecl/,但需运行 pecl install redis 后手动加 extension=redis.
so 到 php.ini
./configure --with-xxx 或后续 make && make install 编译扩展,生成的 .so 通常在 modules/ 目录下php -i | grep "extension_dir" 和 php --ini 是你必须先跑的两条命令,否则你连扩展该放哪、配置从哪读都不知道适用于已存在 .so 文件、只需启用的情况。注意不是所有扩展都支持动态加载(比如某些 ZTS 线程安全版本限制):
php.ini:CLI 和 Web(如 Nginx + PHP-FPM)可能用不同配置文件,php --ini 显示的是 CLI 的,phpinfo() 页面里看的是 Web 的extension=mysqli.so(Linux/macOS)或 extension=php_mysqli.dll(Windows),少个 php_ 前缀或后缀错误都会导致 PHP Warning: Unable to load dynamic library 'xxx'
pdo_mysql 依赖 pdo),extension=pdo.so 必须写在前面sudo systemctl restart php8.2-fpm,Apache 要 sudo systemctl restart apache2
PECL 是 PHP 官方扩展仓库,但不是所有扩展都能一键成功:
phpize 可用且版本匹配:phpize --version 应与 php -v 一致,否则编译出的 .so 会报 undefined symbol: core_globals
pecl install redis 前可能要 sudo apt install php-dev pkg-config(Ubuntu)或 brew install autoconf(macOS)php.ini,但别盲目照抄——检查路径是否真实存在,比如它说 extension=redis.so,你要用 ls /usr/lib/php/20250829/redis.so 确认文件在不在pecl install swoole 默认编译为异步模式,若项目不需要协程,可加 --enable-sockets 减少依赖,避免因缺少 libuv 报错php -m | grep -E "(redis|mysqli|pdo)" # 查看已启用的扩展,确认是否真加载成功 # 注意:如果输出为空,说明没启用;如果报段错误,很可能是 .so 版本与 PHP 不兼容
最容易被忽略的是:Web 服务器用的 PHP 配置和你在终端里 php -m 看的不是同一套。哪怕 php -m 显示 redis 已加载,phpinfo() 里没有,那一定是 FPM 或 Apache 加载了另一个 php.ini。务必用 phpinfo() 页面里的 Loaded Configuration File 路径为准。