答案是CLI与Web环境配置分离导致扩展加载不一致:php -v仅验证PHP二进制可用,需用php -m检查CLI模块(如pdo、pdo_mysql)、php --ini定位对应php.ini并启用扩展,同时确认Web SAPI(如Apache/Nginx)的独立配置已正确修改并重启服务。

配置要求检查通过 ≠ PHP 8.3 能跑项目,真正卡住人的往往是「CLI 和 Web 两套环境各自独立、互不感知」这个事实。
php -v 成功但 composer install 报 Class 'PDO' not found
这是典型的 CLI 配置生效但扩展没开。php -v 只说明二进制可用,不代表扩展加载了。
-
php -m查看已启用模块,重点确认mbstring、pdo、pdo_mysql、openssl是否在列表里 - 如果缺失,别急着重装——先运行
php --ini看 “Loaded Configuration File” 路径,然后打开那个php.ini文件,检查对应行是否取消注释:extension=mbstring(不是;extension=mbstring,也不是extension = "mbstring") - Windows 下还要确认
extension_dir = "ext"指向的目录真实存在且含php_mbstring.dll等文件;macOS Homebrew 用户路径通常是/opt/homebrew/etc/php/8.3/php.ini
phpinfo() 显示旧版本或没扩展
浏览器里看到的 PHP 行为,由 Web SAPI 决定,和终端里 php -v 完全是两回事。
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- Apache 场景:改完
/etc/php/8.3/apache2/php.ini后,必须执行sudo a2enmod php8.3+sudo systemctl restart apache2,旧模块如php8.2得先a2dismod - Nginx + PHP-FPM 场景:改的是
/etc/php/8.3/fpm/php.ini,重启服务用sudo systemctl restart php8.3-fpm,不是nginx本身 - 验证 Web 加载的真实配置:在
phpinfo()页面 Ctrl+F 搜 “Loaded Configuration File”,和 CLI 的php --ini输出对比,两者路径不同是常态
本地开发用内置服务器却报 404 或空白页
PHP 内置服务器(php -S)不走 Apache/Nginx,也不读 FPM 配置,它只认 CLI 的 php.ini 和当前目录结构。
立即学习“PHP免费学习笔记(深入)”;
- 启动命令必须带 router 文件(如 Laravel 的
php -S localhost:8000 server.php),否则静态文件可能被忽略 - 确保
server.php或router.php存在且返回值是布尔或数组,不能有echo/print提前输出 - 如果提示 “Failed to open stream”,大概率是
SCRIPT_FILENAME解析路径错误——不要手动拼路径,让框架 router 处理路由转发
最容易被忽略的点:同一台机器上 CLI 和 Web SAPI 使用完全不同的 php.ini,改错一个文件,另一个环境照常崩。动手前先跑两遍 php --ini 和 php -i | grep 'Loaded Configuration File',确认你在改的是对的那个文件。


















