应执行 frankenphp -m 查看实际加载的扩展,确认 pdo 和 pdo_mysql 是否存在;若为静态二进制版,则需用 frankenphp php-cli -r "print_r(PDO::getAvailableDrivers());" 验证内置驱动。

直接用 frankenphp -m 查它自己加载的扩展列表,而不是系统 php -m —— 这是判断 PDO 是否真正可用的第一步,也是唯一可信依据。
确认 PDO 及驱动是否在 FrankenPHP 实际运行时中启用
FrankenPHP 不继承系统 PHP 配置,php -m 输出的是 CLI 环境下的扩展,完全不能代表 Web 或 Worker 模式下实际加载情况。
- 执行
frankenphp -m,检查输出里是否有pdo和pdo_mysql(或pdo_pgsql等对应驱动) - 若只有
pdo没有pdo_mysql,说明驱动未加载;若两者都无,基础 PDO 扩展也缺失 - 注意:静态二进制版 FrankenPHP 可能已将
pdo_mysql编译进内核,此时-m不显示,但php -r "print_r(PDO::getAvailableDrivers());"会返回['mysql', 'sqlite']
核对 php.ini 路径与 extension_dir 是否匹配
FrankenPHP 启动时读取的 php.ini 是它自己指定的路径,不是系统默认位置。路径错、目录空、文件名拼错,都会导致扩展静默不加载。
- 运行
frankenphp --php-config查看它实际加载的配置文件路径 - 打开该 php.ini,确认存在且未被注释的行:
extension=pdo_mysql(Linux)或extension=php_pdo_mysql.dll(Windows) - 检查
extension_dir值是否指向含pdo_mysql.so的真实目录(如/usr/lib/php/8.3/franken),而非系统 PHP 的路径 - 若用 Docker,确保
RUN install-php-extensions pdo_mysql在COPY ./app之前执行,避免缓存跳过安装
在 HTTP 请求上下文中验证函数级可用性
扩展名对 ≠ 函数能用。有些扩展虽加载成功,但因 disable_functions、SAPI 限制或 ABI 不兼容,在 Web 请求中仍不可调用。
立即学习“PHP免费学习笔记(深入)”;
- 新建
check-pdo.php放入 public 目录:
<?php
if (!extension_loaded('pdo') || !in_array('mysql', PDO::getAvailableDrivers())) {
die('PDO or MySQL driver missing');
}
try {
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 3,
]);
echo "PDO MySQL OK\n";
} catch (Exception $e) {
die('Connection failed: ' . $e->getMessage());
}
?>
- 用浏览器或
curl http://localhost:8080/check-pdo.php访问,观察是否报Class 'PDO'或Call to undefined method PDO::getAvailableDrivers() - 若报错,查看 FrankenPHP 日志(默认 stdout 或 Caddyfile 中指定日志路径),找
undefined symbol类提示 —— 多为扩展未用frankenphp-build重编译
区分静态与动态二进制行为差异
FrankenPHP 1.4 官方发布的 frankenphp-static 版本禁用 dlopen(),所有 .so 扩展均无法加载,包括 pdo_mysql.so。
- 运行
file frankenphp,若含statically linked,即为静态版 - 此时不要在 php.ini 写
extension=pdo_mysql—— 它会被忽略,不报错也不生效 - 改用内置能力验证:
frankenphp php-cli -r "print_r(PDO::getAvailableDrivers());",有mysql即可 - 若返回空数组或报错,则需换用动态镜像(如
dunglas/frankenphp:alpine)并手动安装扩展



















