答案是which php和php --ini路径必须一致,否则CLI与配置脱节;需确保二者指向同一PHP 8.3安装路径及真实php.ini文件,且composer show --platform输出与之匹配。

which php 和 php --ini 必须匹配真实路径
终端里敲 php -v 显示 8.3.x,不代表你真在用它——which php 和 php --ini 的输出必须指向同一套安装路径,否则 CLI 和配置完全脱节。
-
which php输出必须是你的 PHP 8.3 二进制位置:macOS Apple Silicon 是/opt/homebrew/bin/php,Intel 是/usr/local/bin/php;Windows 是C:\php\php.exe;Ubuntu/Debian 通常是/usr/bin/php(但需确认来自php8.3-cli包) -
php --ini中 “Loaded Configuration File” 行不能是(none),必须明确指向一个真实存在的php.ini,例如/opt/homebrew/etc/php/8.3/php.ini或C:\php\php.ini - 若
which php和php --ini路径不一致(比如前者指向 Homebrew,后者显示/etc/php/8.3/cli/php.ini),说明系统有多个 PHP 共存,PATH 或 symlink 混乱
php -m 必须列出关键扩展,且无报错
扩展缺失不是“少装一个包”,而是配置未生效的信号。php -m 不仅要看有没有 mbstring、pdo、opcache,更要看有没有警告或致命错误输出。
- 运行
php -m | grep -E '^(mbstring|pdo|opcache|fileinfo|zip|openssl)$',每项都应有输出;缺fileinfo会导致 Laravel/ThinkPHP 安装失败 - 如果
php -m开头就报PHP Warning: Module 'xxx' already loaded或Unable to load dynamic library,说明extension_dir路径错、DLL/SO 文件不存在,或重复启用了同一扩展 - Windows 下常见问题:
extension=php_openssl.dll写成extension=openssl,或extension_dir = "ext"但实际解压结构里没有ext文件夹
phpinfo() 页面的 Server API 和 Loaded Configuration File 必须与 Web 场景一致
浏览器里打开 phpinfo() 看到的,和你在终端里跑的结果,完全是两套体系。Web 请求走的是 Apache/Nginx + FPM 或 mod_php,它读的 php.ini 和 CLI 的根本不同。
- 检查
phpinfo()页面顶部 “Server API” 字段:如果是Apache 2.0 Handler,说明用的是 mod_php,该看/etc/php/8.3/apache2/php.ini(Ubuntu)或C:\php\php.ini(Windows Apache);如果是FPM/FastCGI,说明走的是 PHP-FPM,该查/etc/php/8.3/fpm/php.ini或/opt/homebrew/etc/php/8.3/fpm/php.ini - “Loaded Configuration File” 行必须和你刚改的那个
php.ini路径完全一致;如果显示的是旧路径(如/etc/php/7.4/cli/php.ini),说明 Web 服务根本没加载新配置 - Nginx + PHP-FPM 场景下,改完
fpm/php.ini后必须执行sudo systemctl restart php8.3-fpm;Apache 场景下要sudo systemctl restart apache2,否则 phpinfo() 永远不会更新
composer show --platform 才是最终仲裁者
很多项目卡在 composer install 报错,不是因为 php -v 不对,而是 Composer 实际调用的 PHP 解释器和你预期的不一样——composer show --platform 会暴露它底层真正看到的环境。
立即学习“PHP免费学习笔记(深入)”;
- 运行
composer show --platform,对比输出里的php版本、ext-mbstring、ext-pdo是否全为enabled;只要有一项是disabled或版本不符,Composer 就会拒绝安装 - 如果
php -v是 8.3.6,但composer show --platform显示php: "8.2.12",说明 Composer 走的是另一个 PHP —— Windows 上常因where php返回多个路径,且老版本排在前面;macOS/Linux 可能存在/usr/bin/php和/opt/homebrew/bin/php冲突 - 临时验证可用
php /path/to/composer.phar show --platform强制指定解释器,避免 PATH 干扰
php.ini。漏掉任意一环,都会出现“看着正常,用着报错”的情况。



















