必须用frankenphp -m查真实加载清单,确认pdo_mysql等在列;执行frankenphp php-cli -r "echo ini_get('extension_dir');"验证路径是否为/franken子目录;再通过frankenphp php-server运行check-ext.php实测函数可用性。

要在 macOS 上确认 FrankenPHP v1.2.0 的 PHP 扩展是否真正启用,不能只查系统 php -m 或依赖 Finder 看文件是否存在——FrankenPHP 自带独立 PHP 运行时,扩展加载路径、SAPI 层和初始化时机都与系统 PHP 完全隔离,必须用它自己的二进制触发真实加载流程。
第一步:确认 frankenphp 二进制路径并检查其调用的 PHP 版本
打开终端,执行 which frankenphp,确保返回的是 v1.2.0 对应的安装路径(如 /opt/homebrew/bin/frankenphp 或 /usr/local/bin/frankenphp)。
接着运行 frankenphp run --help 2>/dev/null | head -n 1,观察首行输出是否含 PHP 8.3.x 或类似字样——这证明它正在使用目标 PHP 内核,后续所有扩展检查才有意义。【若首行无 PHP 版本信息,说明 frankenphp 未正确链接内置 PHP,-m 结果将完全不可信】
第二步:用 frankenphp -m 获取真实扩展清单
直接执行 frankenphp -m。
该命令会启动一个最小化 FrankenPHP 实例,输出其 SAPI 层实际加载的扩展列表(含内置模块和动态 .so 文件)。
重点检查项目依赖项是否在列:pdo_mysql、curl、mbstring、opcache、json;若用 Redis,需看到 redis(不是 php-redis);若用 GD,需看到 gd。
注意:opcache 属于 zend_extension,-m 默认不显示,但它若缺失,frankenphp -m 输出中通常会伴随警告或直接失败——所以没报错且其他扩展正常,opcache 很可能已就位。
第三步:验证 extension_dir 路径是否指向 FrankenPHP 自带扩展目录
执行 frankenphp php-cli -r "echo ini_get('extension_dir');"。
典型正确路径为 /opt/homebrew/Cellar/frankenphp/1.2.0/lib/php/8.3/franken 或 /usr/local/lib/php/8.3/franken ——结尾必须是 /franken 子目录。
如果输出是 /usr/lib/php/8.3 或其他系统路径,说明 php.ini 配置错误或 frankenphp 读取了错误的配置文件,扩展即使名字对也会静默失败。【extension_dir 错误是 macOS 上最常见导致扩展“显示已加载但函数不可用”的原因】
第四步:在 Web 请求上下文中实测关键函数是否可用
新建一个 check-ext.php 文件,内容如下:
<?php <br>if (!extension_loaded('pdo_mysql')) { die('pdo_mysql missing'); }<br>if (!function_exists('pdo_drivers')) { die('pdo_drivers() not available'); }<br>if (!in_array('mysql', pdo_drivers())) { die('mysql driver not enabled in PDO'); }<br>echo "PDO MySQL OK\n";<br>?>
保存后,用 FrankenPHP 内置 HTTP 服务直接运行:frankenphp php-server --document-root . check-ext.php。
若终端输出 PDO MySQL OK,说明扩展不仅加载成功,而且驱动注册、函数暴露、运行时初始化全部通过。
若报错 Fatal error: Uncaught Error: Call to undefined function pdo_drivers(),则问题出在扩展未在 Web SAPI 下启用,或被 disable_functions 拦截。
第五步:macOS 特有检查——systemextensionsctl 不相关,但需排除签名与权限干扰
FrankenPHP 是普通用户态二进制,不涉及 macOS 系统扩展(systemextensionsctl 管理的是 kernel extension 和 network extension),所以不用查 systemextensionsctl。
但 macOS Gatekeeper 可能拦截首次运行:若执行 frankenphp -m 报 Operation not permitted,右键该二进制 → “显示简介” → 勾选“仍要打开”。
此外,确认磁盘没有启用“锁定”或“只读”挂载——某些 APFS 卷在 Time Machine 备份期间会临时设为只读,导致 extension_dir 下的 .so 文件无法 dlopen。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











