php cli脚本应直接使用stdin、stdout、stderr:stdin用fgets()读行并trim()去换行;stdout用fwrite()精确输出;stderr专用于报错且不受重定向影响;三者均预打开、免关闭,但须先判断defined('stdin')确保cli环境。

PHP CLI 脚本中直接用 STDIN 和 STDOUT 做输入输出,不用 fopen、不用 php:// 协议封装,这是最简洁也最稳妥的方式——前提是脚本运行在 CLI 模式下。
STDIN 读取用户输入要逐行 + 去换行符
STDIN 是只读流,推荐固定用 fgets(STDIN) 获取一行,不能用 file_get_contents 或 fread 不加长度限制,否则容易阻塞或读过头。
-
fgets(STDIN)自动按行缓冲,遇到 \n 或 EOF 停止,返回含末尾换行符的字符串 - 必须手动
trim()才能得到干净输入,比如$name = trim(fgets(STDIN)); - 避免混用
fgets(STDIN)和fopen('php://stdin', 'r'),后者会新建句柄,可能干扰已有缓冲 - 读数字可用
fscanf(STDIN, "%d", $num),但注意它不吞换行,后续 fgets 可能读到空行
STDOUT 写入等效于 echo,但更可控
向终端打印正常信息,fwrite(STDOUT, $str) 和 echo $str 效果一致,但前者可精确控制写入字节数,适合调试或协议交互场景。
-
fwrite(STDOUT, "Hello\n")明确写入,不带自动追加换行(echo 会) - 无需 fclose,脚本结束时 PHP 自动释放 STDOUT 句柄
- 不要对 STDOUT 做 fseek 或 rewind,它是只写流,调用会失败
- 若需格式化输出(如进度条、覆盖上一行),可结合 \r 和 flush(),但 fwrite 更易预测行为
STDERR 专用于报错,不受重定向影响
当命令执行时加了 > out.txt 或 2> err.log,只有 STDERR 仍会显示在终端——这是区分“结果”和“提示/错误”的关键机制。
- 报错信息统一走
fwrite(STDERR, "Error: ...\n"),不混进 STDOUT - 即使 stdout 被重定向,
php script.php > /dev/null时 STDERR 仍可见 - 调试时可临时把日志写 STDERR,避免污染主输出流
- Web 环境(Apache/FPM)中这些常量未定义,直接使用会触发 Notice,务必先判断
if (defined('STDIN'))
不复杂但容易忽略:CLI 流操作的核心是“预打开、免管理、分用途”。用对 STDIN/STDOUT/STDERR,脚本能自然适配管道、重定向和自动化调用场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











