必须绕过Gatekeeper拦截:右键“打开”临时豁免或xattr -d com.apple.quarantine清除隔离属性;运行./frankenphp php-cli script.php,禁用$_SERVER硬编码,用__DIR__或getcwd()替代,确认file输出含Mach-O且php_sapi_name()为"franken"。

在 macOS 上用 FrankenPHP v1.4 运行单个 PHP 文件,必须绕过 Gatekeeper 对未公证二进制的拦截,同时确保脚本路径正确、PHP 运行时能加载且不依赖 Web 环境变量——否则会报错“Undefined index: REQUEST_URI”或直接静默退出。
确认并解除 Gatekeeper 拦截
运行前先检查是否被系统阻止:执行 file frankenphp,若输出含 Mach-O 64-bit executable 但 ./frankenphp 报 Operation not permitted,说明 Gatekeeper 已拦截。
右键 Finder 中的 frankenphp → 选择“打开” → 弹窗点“仍要打开”。这一步仅豁免该文件一次,后续终端执行 ./frankenphp 就能通过。
如需批量处理或脚本化,改用命令清除隔离属性:xattr -d com.apple.quarantine frankenphp。注意:此命令只对 Safari/Chrome 下载的文件有效;若用 curl -O 获取,需先在当前目录执行 open -a Finder . 触发 quarantine 标记再清除。
立即学习“PHP免费学习笔记(深入)”;
用 php-cli 子命令执行 PHP 文件
FrankenPHP v1.4 的 php-cli 模式专为单文件设计,不走 Web 流程,也不读 Caddyfile 或 public/ 目录。
方法一:直接执行(推荐用于调试)
在 PHP 文件所在目录运行:./frankenphp php-cli script.php。路径支持相对路径,但不能是 ../other/script.php —— 【FrankenPHP v1.4 不解析上级路径,会报 file not found】。
方法二:带错误提示执行(开发必备)
加参数强制显示错误:./frankenphp php-cli -d display_errors=1 -d error_reporting=E_ALL script.php。默认情况下错误被静默吞掉,不加这组参数可能看到空白输出却不知哪行崩了。
方法三:绝对路径执行(规避工作目录干扰)
用 $(pwd)/script.php 构造绝对路径:./frankenphp php-cli "$(pwd)/script.php"。这能避免因终端当前路径不在脚本目录导致的“no such file”错误。
避开常见陷阱
第一步:删掉所有 $_SERVER 硬编码假设
CLI 模式下 $_SERVER['REQUEST_URI']、$_SERVER['DOCUMENT_ROOT'] 等变量根本不存在。脚本里写 echo $_SERVER['HTTP_HOST'] 会触发 Notice 并中断执行。改用 __DIR__ 或 getcwd() 获取路径。
第二步:验证 FrankenPHP 是否真在跑你的脚本
临时建一个 test.php,内容为 <?php echo "OK\n"; var_dump(php_sapi_name()); ?>。运行后若输出 string(7) "franken",说明成功;若输出 string(3) "cli",说明你误调了系统 PHP 而非 FrankenPHP。
第三步:检查架构匹配
FrankenPHP v1.4 macOS 版分 x86_64 和 arm64 两种。运行 uname -m 查看本机架构,再执行 file frankenphp 确认二进制架构一致。不匹配会报 exec format error,chmod +x 也救不了。



















