PHP CLI脚本开发需适配无超时、无输出缓冲、直连标准流等特性:用#!/usr/bin/env php声明入口并chmod +x赋权;参数解析优先getopt(),错误输出到STDERR,日志记录与信号处理提升稳定性,启用opcache.enable_cli=1加速执行。

PHP8命令行脚本开发不是把Web代码搬进终端,而是要适配CLI SAPI的运行特性——无超时、无输出缓冲、直接对接标准流。掌握几个关键点,就能写出稳定、易用、可维护的工具。
设置正确入口与执行权限
脚本需在首行声明解释器路径,推荐使用#!/usr/bin/env php,它比硬编码/usr/bin/php更兼容不同系统环境。保存为backup.php后,必须运行chmod +x backup.php赋予可执行权限,之后才能用./backup.php --env=prod方式调用。若跳过这步,系统会报“Permission denied”而非语法错误,容易误判。
参数解析要兼顾简洁与健壮
简单场景用$argv足够:$argv[0]是脚本名,$argv[1]起为参数。但带选项(如-f file.json或--force)时,应优先用getopt()。例如:
-
$opts = getopt('f:h', ['file:', 'help']);支持短选项和长选项混用 - 未匹配参数会进入
$argv剩余部分,可组合处理 - 务必检查必需参数是否存在,缺失时输出简明帮助并
exit(1)
输入输出要区分用途和流向
CLI中echo默认输出到stdout,适合正常信息;错误提示必须用fwrite(STDERR, "错误信息\n"),确保管道或重定向时错误仍可见。交互式输入统一用fgets(STDIN),记得trim()去换行符。例如确认操作:
立即学习“PHP免费学习笔记(深入)”;
echo "删除所有缓存?(y/N): "; $ans = strtolower(trim(fgets(STDIN)));- 避免用
readline()除非已启用扩展,它在多数生产环境不可用
提升稳定性与可观测性
CLI脚本常用于定时任务或后台作业,不能崩溃即消失。建议:
- 设置自定义错误处理器:
set_error_handler(fn($e) => error_log("ERR: $e")); - 关键步骤记录日志到文件,用
file_put_contents('log.txt', date('c') . " - OK\n", FILE_APPEND); - 长期运行脚本(如队列消费者)注册信号处理器:
pcntl_signal(SIGTERM, fn() => { cleanup(); exit(0); }); - 启用OPcache加速:在php.ini中设
opcache.enable_cli=1,尤其对频繁调用的脚本效果明显



















