frankenphp 的 php-cli 用于直接执行单文件脚本,不依赖系统 php;php-server 启动 web 服务,集成 caddy 与 php worker;二者均不读取外部 php.ini,配置需在代码中动态设置或重新编译。

frankenphp php-cli 直接执行脚本
FrankenPHP 独立二进制自带 PHP 运行时,不依赖系统 PHP,php-cli 子命令就是专为运行单文件脚本设计的。它跳过 Web 服务器层,直接加载并执行 PHP 代码,适合定时任务、数据迁移、命令行工具等场景。
常见错误现象:command not found: php(误以为要装系统 PHP)、Parse error 却没看到完整报错(因默认不输出详细错误)、脚本里用 $_SERVER 变量时报未定义(CLI 模式下该超全局变量不全)。
- 确保你用的是官方发布的 FrankenPHP 二进制(如
frankenphp),不是 Docker 镜像或源码编译版(后者 CLI 行为可能不同) - 执行命令格式固定:
./frankenphp php-cli /path/to/script.php,路径必须是绝对路径或相对于当前工作目录的正确路径 - 如需调试,加
-d display_errors=1 -d error_reporting=E_ALL:例如./frankenphp php-cli -d display_errors=1 script.php - 脚本中避免硬编码 Web 环境假设——比如不要依赖
$_SERVER['DOCUMENT_ROOT']或$_SERVER['REQUEST_URI'],改用__DIR__或getcwd()
frankenphp php-server 启动 Web 服务
这是运行 Laravel、Symfony 等 Web 应用的标准方式,本质是启动内置 Caddy + PHP Worker 的组合服务。它会读取当前目录下的 Caddyfile(或通过 -config 指定),然后托管 public/ 目录。
容易踩的坑:404 Not Found 却没报错——大概率是 Caddyfile 里 root 路径写错,或 php_server 块没生效;500 Internal Server Error 且日志空白——可能是 public/index.php 报了致命错误,但错误被静默吞掉(因默认 display_errors=Off)。
- 最简启动:
./frankenphp php-server,要求当前目录有Caddyfile且其中包含php_server指令 - 指定配置文件:
./frankenphp php-server -config ./my-caddy.caddyfile,路径必须可读 - 强制 HTTP 模式(跳过 HTTPS 自动签发):
SERVER_NAME=localhost ./frankenphp php-server - 查看实时日志:
./frankenphp php-server -log-level debug,比默认输出更详细,能捕获 PHP 初始化失败
php.ini 配置对 CLI 和 Web 模式都无效?
是的——FrankenPHP 官方静态二进制中的 php.ini 是编译时 embed 的,运行时无法通过 -c 或环境变量替换。这意味着你不能像传统 PHP 那样用 php -c my.ini script.php 来临时覆盖配置。
影响最直接的有三类设置:memory_limit(CLI 脚本跑大数据易 OOM)、opcache.enable(Web 模式下影响热加载)、error_reporting(开发时看不到警告)。
- CLI 场景下想调大内存?只能在脚本开头加
ini_set('memory_limit', '1G');,前提是 embed 的 ini 允许运行时修改(多数生产值是允许的) - Web 模式下要开调试?别碰 php.ini,改应用自身的逻辑,比如 Laravel 中用
app()->environment('local')动态设error_reporting - 真要改底层 ini(如启用扩展、调
max_execution_time)?必须重新编译 FrankenPHP,修改源码中caddy/php/php.go里的模板,再make build - 一个典型误操作:把自定义
php.ini放到/usr/local/lib/并以为生效——FrankenPHP 根本不读那个路径
Docker 场景下怎么让 php-cli 正常工作
官方 dunglas/frankenphp 镜像默认入口是 Web 服务,php-cli 不是主流程,但完全可用。关键在于镜像内路径结构和权限。
常见问题:exec user process caused: no such file or directory(其实是找不到 php-cli 子命令)、挂载的脚本在容器里路径不对、容器内无执行权限。
- 正确用法:
docker run --rm -v $(pwd):/app dunglas/frankenphp php-cli /app/migrate.php - 注意挂载路径映射:宿主机的
$(pwd)映射到容器/app,所以脚本路径必须写成/app/migrate.php,不能写./migrate.php - 如果脚本需要写文件(如生成缓存),确保容器内
/app可写,或挂载时加:rw - 镜像里
php-cli是硬编码的子命令,不支持额外传参如-d,如需调试建议先在本地二进制上验证好再进容器
php-server 下 PHP 错误不打屏,php-cli 下 warning 被吞掉,连 php.ini 都藏在二进制里看不见。动手前先跑一句 ./frankenphp php-cli -v 确认版本和基础能力,比盲目改配置更省时间。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











