核心问题是php代码未被新版本加载,必须执行frankenphp stop-workers或启用watch:true重启worker进程,并清理opcache、框架缓存及构建产物,否则仍运行旧字节码。

FrankenPHP 1.2 代码更新后页面不刷新,核心问题不是“没刷新浏览器”,而是 PHP 代码根本没被新版本加载——它仍运行在旧进程、旧字节码、旧缓存中。必须按执行链路逐层确认,漏掉任一环节都会白改。
确认 worker 进程是否已重启
FrankenPHP 的 worker 是常驻内存的 PHP 进程,reload 命令只重载 Caddy 配置,不会重启 worker。改完代码后若只执行 frankenphp reload,页面必然还是旧逻辑。
- 执行
frankenphp stop-workers:向所有活跃 worker 发送 SIGTERM,它们完成当前请求后退出,Caddy 会自动拉起新实例(前提是 Caddyfile 中配置了startup: 1或未限制) - 或启用自动监听(FrankenPHP ≥ 1.2):在 Caddyfile 的
php_worker块中加watch true,它会监听.php、.env、.yaml变更并触发 worker 退出 - 验证是否生效:访问页面时在控制器里加
var_dump(__FILE__),看路径是否指向你刚修改的新目录;再查opcache_get_status()['scripts'],确认文件哈希已更新
检查构建与缓存是否清理干净
如果你用的是 FrankenPHP 独立二进制(frankenphp build),那它是个静态单文件,任何代码变更都必须重建二进制,且三步缺一不可:
- 构建前重新运行
composer install --no-dev -o:vendor 目录变化不会被自动检测,旧 autoload.php 会被打包进去 - 清空框架缓存:
php bin/console cache:clear --env=prod(Symfony)或php artisan config:clear && php artisan view:clear(Laravel),否则编译后的 PHP 数组和视图模板会固化进二进制 - 显式设置环境变量:
APP_ENV=prod APP_DEBUG=false frankenphp build,否则调试模式下动态加载逻辑可能绕过编译,导致运行时报错或行为不一致
排除 PHP 层级缓存干扰
即使 worker 重启了,OPcache 也可能还在用旧字节码,尤其当 opcache.validate_timestamps=0 时。
- 启动 FrankenPHP 时显式开启并校验时间戳:
frankenphp run --php-flags "-d opcache.enable=1 -d opcache.validate_timestamps=1" - 开发阶段可临时加一句
opcache_reset()到入口文件顶部(public/index.php),确保每次请求都刷新字节码(上线前务必删掉) - 检查是否误启 APCu 缓存:如用了
apcu_store()存配置或查询结果,需在部署脚本中加apcu_clear_cache()
验证异常与调试是否可见
页面空白、无报错、返回 500 却看不到堆栈?这往往掩盖了真实错误,导致你以为“更新成功”实则启动失败。
- 在
public/index.php最顶部插入:ini_set('display_errors', '1');<br>ini_set('output_buffering', 'on');<br>error_reporting(E_ALL);
注意:必须写'1',不能写'On';且必须在require任何框架类之前 - 启动时加
--debug参数:frankenphp serve --debug,HTTP 响应头会出现X-PHP-Exception等调试标识 - 检查日志:
tail -f var/log/dev.log(Symfony)或storage/logs/laravel.log(Laravel),确认是否有 ParseError、Class not found 等致命错误
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











