production模式必须启用display_errors = off、log_errors = on、error_log = /var/log/php_errors.log、expose_php = off、opcache.enable = 1、max_execution_time = 0、opcache.revalidate_freq = 0、memory_limit = 512m、phar.readonly = on、phar.require_hash = on、allow_url_fopen = off、disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source、open_basedir = /app:/tmp、session.save_path = /tmp/php-sessions、upload_tmp_dir = /tmp/uploads、date.timezone = utc。

production模式必须启用的php.ini基础项
FrankenPHP本身不改变PHP核心行为,但它的运行模型(尤其是worker模式)对php.ini中某些配置更敏感。生产环境第一原则:关闭所有调试输出、强制日志落地、禁用危险行为。
-
display_errors = Off和display_startup_errors = Off:必须关。FrankenPHP的Caddy层不会拦截PHP错误输出,一旦开启,错误会直接暴露在HTTP响应体中 -
log_errors = On且error_log = /var/log/php_errors.log:日志路径必须是FrankenPHP容器或二进制进程有写权限的位置;Docker镜像中建议用/var/log/php_errors.log,本地二进制建议用/tmp/php_errors.log(避免权限问题) -
expose_php = Off:防止Caddy响应头里泄露X-Powered-By,FrankenPHP默认已设,但显式声明更稳妥 -
opcache.enable = 1:worker模式下OPcache效果更显著,因为常驻进程能长期复用编译后的opcode
FrankenPHP worker模式下要特别注意的缓存与超时配置
启用frankenphp.worker后,PHP进程不再随请求启停,而是长驻内存。此时max_execution_time和opcache.revalidate_freq的行为会和传统FPM不同。
-
max_execution_time = 0:worker模式下应设为0。否则单个请求超时会导致整个worker进程被杀,触发重建开销 -
opcache.revalidate_freq = 0:代码更新后需手动触发frankenphp reload或发SIGHUP,设为0可避免每次请求都stat文件,提升稳定性 -
memory_limit = 512M:比常规FPM略高。worker常驻,内存不会自动释放,Laravel容器+队列监听器等可能持续占用 -
realpath_cache_size = 4096K和realpath_cache_ttl = 600:FrankenPHP频繁解析public/index.php及vendor路径,增大realpath缓存能减少系统调用
安全加固:phar、远程文件、危险函数三道关
FrankenPHP部署常用于边缘或轻量服务,攻击面更集中,phar反序列化、allow_url_fopen滥用仍是高频入口。
-
phar.readonly = On和phar.require_hash = On:必须启用。FrankenPHP默认未改此值,需手动确认;禁用后无法在运行时关闭 -
allow_url_fopen = Off:Laravel自身不用它,但第三方包(如某些旧版SDK)可能依赖。关掉后报错明显,比被利用强 -
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source:FrankenPHP无shell调度需求,这些函数全禁;注意curl_exec禁用后,Laravel HTTP Client会fallback到stream,不影响基本功能 -
open_basedir = /app:/tmp:Docker场景下设为/app(项目挂载点)和/tmp(session、cache临时目录),禁止跨目录访问
与Caddy协同时容易忽略的路径与权限细节
FrankenPHP把PHP和Web服务器耦合,但php.ini仍独立生效。很多“500错但无日志”问题其实出在路径权限或session配置不匹配。
-
session.save_path = /tmp/php-sessions:必须显式设置,且确保该路径存在、FrankenPHP进程可读写。Docker中常用RUN mkdir -p /tmp/php-sessions && chmod 777 /tmp/php-sessions -
upload_tmp_dir = /tmp/uploads:配合Caddy的client_max_body_size使用,否则大文件上传会卡在临时文件写入阶段 -
date.timezone = UTC:FrankenPHP容器默认无时区,Laravel日志、Carbon时间都依赖此项,不设会导致Warning: date(): It is not safe to rely on the system's timezone settings - 所有路径(
error_log、session.save_path、upload_tmp_dir)都不能落在/app内——Caddy会把它当静态资源尝试返回,造成403或内容泄露
max_execution_time)突然有了进程级影响。worker模式下改完配置不重启进程,等于没改。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











