必须删除.git、tests/、docs/、examples/、vendor/bin/、storage/logs/、storage/framework/cache/、node_modules/;.env需设APP_ENV=prod和APP_DEBUG=false,执行composer install --no-dev --optimize-autoloader,并清理Laravel缓存。

必须清理无关文件、锁定环境变量、生成生产级 autoload,否则二进制会启动失败或体积暴涨
哪些文件必须删掉
FrankenPHP 二进制运行时会把整个打包目录当根路径加载,所以任何开发期残留都会被读取甚至执行:
-
.git目录 —— 不仅冗余,githook 或 submodule 可能触发意外行为 -
tests/、docs/、examples/—— 没有路由指向它们,但会被composer dump-autoload扫描进 autoload map,徒增体积 -
vendor/bin/—— 里面全是开发用 CLI 工具(如phpunit、php-cs-fixer),运行时根本用不到 -
storage/logs/和storage/framework/cache/—— 日志和缓存是运行时写入的,打包进去反而可能因权限/时间戳引发问题 -
node_modules/—— 前端构建产物应已输出到public/,源码留着只会让 tar 包膨胀数倍
哪些配置必须设为 prod
不是只改 .env 就完事。FrankenPHP 启动 PHP 时不会跑 Laravel/Symfony 的 artisan 命令,所有预编译动作得你手动做完:
-
.env中必须含APP_ENV=prod和APP_DEBUG=false;若用composer dump-env prod,则删掉.env,只留.env.local.php - 执行
composer install --no-dev --optimize-autoloader——--no-dev确保autoload-dev不生效,--optimize-autoloader生成classmap,避免运行时遍历psr-4目录 - Laravel 用户额外跑
php artisan config:clear和php artisan view:clear,否则bootstrap/cache/config.php和storage/framework/views/里的旧缓存会覆盖新配置
public/ 下的入口和 router 文件怎么处理
FrankenPHP 默认托管 public/,但它不自动识别 index.php,必须显式声明路由逻辑:
立即学习“PHP免费学习笔记(深入)”;
-
public/.frankenphp.router.php必须存在,最简内容是:<?php return [ 'index' => 'index.php', ]; - 如果项目用了自定义域名或需要动态
APP_URL,别在.env里硬写,而是在 router 文件里补:$_SERVER['APP_URL'] = 'https://' . ($_SERVER['HTTP_HOST'] ?? 'localhost');
- 确保
public/index.php能直接响应 HTTP 请求(比如访问curl -I http://localhost:8080返回 200),否则打包后连首页都打不开
最容易被忽略的是 storage/ 目录权限和 public/.frankenphp.router.php 的存在性——前者导致 500 错误无日志可查,后者缺失直接 404,且错误提示极其模糊。打包前务必在本地用 ./frankenphp server --document-root public/ 验证一次。



















