php cli模式最基础运行方式是php命令加脚本路径,无需web服务器;需确保php --version正常,脚本应为utf-8无bom格式;用php_sapi_name()或php_sapi区分cli/web环境;参数用$argv或getopt(),输入用fgets(stdin)或php://stdin;注意错误显示、超时、工作目录及输出缓冲差异。

直接用 php 命令执行脚本文件
PHP CLI 模式最基础的运行方式就是调用 php 命令加脚本路径,不需要 Web 服务器或任何额外配置。只要系统 PATH 中有 PHP 可执行文件,就能跑。
- 确保已安装 PHP 并可执行:
php --version能正常输出版本号 - 脚本第一行不强制要求
#!/usr/bin/env php,但加上后可直接chmod +x script.php && ./script.php运行(注意:仅限 Unix/Linux/macOS) - Windows 下不支持 shebang,必须显式调用
php script.php - 如果脚本含 BOM(UTF-8 with BOM),CLI 下可能报
Parse error: syntax error, unexpected ''—— 用编辑器另存为「UTF-8 无 BOM」格式
如何让脚本区分 CLI 和 Web 环境
很多脚本既要支持命令行又要兼容 Web 请求,得靠 php_sapi_name() 或 PHP_SAPI 判断运行模式,而不是依赖 $_SERVER['REQUEST_METHOD'](CLI 下它不存在)。
- 推荐写法:
if (php_sapi_name() === 'cli') { /* CLI 专属逻辑 */ } -
PHP_SAPI是常量,值为字符串'cli'或'apache2handler'等,比php_sapi_name()少一次函数调用开销 - 别用
isset($_SERVER['REMOTE_ADDR'])判断 —— CLI 下$_SERVER不完整,某些键根本不存在,容易触发 Notice - 如果脚本入口统一,建议把 CLI 参数解析、日志输出、数据库连接等初始化逻辑封装到独立函数中,避免和 Web 流程混杂
CLI 下传参和读取输入的常见写法
CLI 脚本经常要接收命令行参数或交互式输入,$argv 和 fgets(STDIN) 是最常用组合,但要注意边界情况。
-
$argv[0]是脚本名,$argv[1]才是第一个用户参数;参数带空格时需用引号包裹,如php script.php "hello world" - 推荐用
getopt()解析带选项的参数(如-f file.txt -v),比手动处理$argv更健壮,支持短选项/长选项/参数绑定 - 读取用户输入用
fgets(STDIN),别用readline()—— 它在部分 Docker 环境或重定向输入时会失败(如php script.php ) - 从标准输入读取全部内容可用
file_get_contents('php://stdin'),适合处理 JSON 或大段文本,但注意内存占用
CLI 脚本容易被忽略的陷阱
CLI 看似简单,但默认行为和 Web 差异很大,几个关键点不注意就会出错。
- 错误报告级别不同:CLI 默认开启
display_errors=1,但不会输出 HTML 标签 —— 错误直接以纯文本打印到终端;而 Web 下可能被框架拦截或静默丢弃 - 超时限制:CLI 模式默认无
max_execution_time限制(值为 0),但如果你在脚本里手动设了set_time_limit(30),它依然生效 - 工作目录:CLI 启动时的当前目录是终端所在路径,不是脚本所在目录 —— 用
__DIR__或dirname(__FILE__)定位资源,别依赖相对路径./config.php - 输出缓冲:CLI 下
ob_start()仍有效,但ob_flush()和flush()对终端输出基本无效(除非配合stdout重定向或 TTY 检测)
实际跑一个脚本前,先确认 php -v 输出的版本和你代码语法兼容,特别是用了 match 表达式或属性(PHP 8.0+)却部署在旧环境时,错误信息不会友好提示“语法不支持”,而是直接报 Parse error。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











