PAYATHON 2026

PHP 内置 Web 服务器提示找不到 PDO,如何排查?

数据小许

结论

php -S 启动的是 PHP 内置 Web 服务器,通常使用 CLI SAPI。如果服务器请求报错 Class 'PDO' not found,但命令行脚本可以使用 PDO,先确认两边使用的 PHP 可执行文件、配置文件和启动环境是否相同。仅运行 php -m 无法确认服务器进程加载了相同的模块。

题目中的 phpinfo() Configure Command 显示 --disable-pdo,但 php -m 列出了 PDO 及其驱动。这些信息可能来自不同的 PHP 构建或运行环境,建议在内置服务器实际处理的请求中核对。

核对服务器实际加载的 PHP 环境

临时在服务器访问的 PHP 文件中输出以下信息:

<?php
header('Content-Type: text/plain; charset=utf-8');
echo 'PHP_BINARY: ' . PHP_BINARY . "\n";
echo 'PHP_VERSION: ' . PHP_VERSION . "\n";
echo 'PHP_SAPI: ' . PHP_SAPI . "\n";
echo 'php.ini: ' . (php_ini_loaded_file() ?: '(none)') . "\n";
echo 'scanned ini: ' . (php_ini_scanned_files() ?: '(none)') . "\n";
echo 'PDO loaded: ' . (extension_loaded('PDO') ? 'yes' : 'no') . "\n";
echo 'PDO class exists: ' . (class_exists('PDO') ? 'yes' : 'no') . "\n";

然后在启动服务器的同一个终端运行:

command -v php
php -v
php --ini
php -m

对照服务器请求输出的 PHP_BINARY、php.ini 和扩展状态与命令行结果。php --ini 显示的是命令行加载的配置;服务器请求中的 php_ini_loaded_file() 和 php_ini_scanned_files() 才显示该请求对应进程使用的配置。

根据差异处理

  • PHP 二进制文件不同: 使用命令行确认可以加载 PDO 的 PHP 可执行文件启动服务器,例如:

    /path/to/php -S 127.0.0.1:8000
  • 配置文件不同: 启动时显式指定正确的配置文件:

    /path/to/php -c /path/to/php.ini -S 127.0.0.1:8000

    检查该配置文件和扫描目录中的配置,确认已启用 PDO 及所需驱动。修改配置后重启服务器,让新进程加载配置。

  • 服务器和命令行信息一致,但结果仍不同: 确认浏览器请求到达的是这个内置服务器进程,并检查启动命令、环境变量和服务器错误输出。也可以用最小脚本单独验证 class_exists('PDO'),排除应用代码或路由的影响。

PDO 与数据库驱动

PDO 类和具体数据库驱动需要分别检查。PDO 类存在只说明 PDO 可用;连接数据库还需要对应驱动,例如 SQLite 需要 pdo_sqlite。如果错误仍是 Class 'PDO' not found,先解决 PDO 未加载的问题;如果错误变为找不到驱动,再检查对应的驱动扩展。

备注:内容仅供参考。