最主要原因是在frankenphp中未启用laravel所需的扩展(如mbstring、openssl、xml、zip等),因其静态二进制默认仅含基础扩展,需通过--php-ini指定配置或docker中install-php-extensions显式启用。

FrankenPHP 1.2 部署 Laravel 项目时出现扩展缺失,核心原因是其静态二进制默认只包含基础扩展(如 pdo_sqlite、ctype、json),而 Laravel 运行实际依赖更多扩展(如 mbstring、openssl、curl、xml、zip 等)。不能靠“忽略平台要求”硬绕,必须显式补全。
确认缺失哪些扩展
别猜,直接查:
- 在项目根目录运行
php -m(确保用的是 FrankenPHP 自带的 PHP CLI); - 对比 Laravel 官方要求:Laravel 10/11 要求
mbstring、openssl、pdo、tokenizer、xml、ctype、json、curl、zip; - 重点看输出里有没有
mbstring、xml、zip——这三个最容易缺,且 Laravel 启动时就报错。
Linux/macOS 下用 --php-ini 指定扩展配置
FrankenPHP 静态二进制不支持 php.ini 中的 extension=xxx.so 动态加载(因为没带 .so 文件)。但支持通过 --php-ini 加载含 zend_extension 或启用内置模块的配置文件。
- 新建一个
frankenphp.ini,内容至少包含:extension=mbstring<br>extension=openssl<br>extension=xml<br>extension=zip
- 启动时带上参数:
./myapp --php-ini frankenphp.ini; - 注意:FrankenPHP 1.2 内置了这些扩展的静态链接版本,只要写对名字就能启用,无需额外编译或下载
.so。
Docker 环境下用官方镜像装扩展
如果你用的是 dunglas/frankenphp 官方镜像(推荐生产使用),直接进容器安装:
- 执行
docker exec -it your-app bash; - 运行
install-php-extensions mbstring openssl xml zip curl; - 该命令会自动启用对应模块,并更新
php.ini; - 重启容器生效(不重启可能部分扩展未加载到进程)。
构建阶段预装扩展(多阶段构建适用)
若你用 static-builder-musl 镜像做生产构建,扩展必须在构建时静态编译进去:
- Dockerfile 中添加:
RUN docker-php-ext-install mbstring openssl xml zip curl; - 确保基础镜像是
dunglas/frankenphp:static-builder-musl,它自带docker-php-ext-install工具; - 不要用
pecl install——static-builder镜像没装pecl,也缺少编译依赖; - 构建完的二进制天然支持这些扩展,无需运行时再配。
扩展缺失不是权限或路径问题,而是 FrankenPHP 的“精简哲学”所致。补全方式取决于你用的是独立二进制、Docker 官方镜像,还是自定义构建流程。对号入座,一条命令或几行配置就能解决。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











