PHP CLI脚本STDIN输入问题:持续读取命令至空输入退出
PHP CLI 脚本:持续读取输入直到空行退出的实现
先梳理你原代码里的几个问题:
- $argv 索引错误:$argv[0]是脚本名,第一个传入参数是$argv[1],你写的
argv[2]不仅索引错误,还缺失了$符号 - if语句语法错误:
if (argv[2] == "-d"既未闭合括号,也没加花括号包裹代码块 - 空输入判断逻辑问题:fgets读取的内容会包含换行符,直接用empty判断空行(仅按回车)会不生效,需要先做trim处理
下面是修正后的完整实现,同时支持启动时未传参数的补录,以及持续读取用户输入直到空行退出:
<?php // 处理启动参数:未传则让用户输入补全 if (sizeof($argv) <= 1) { echo "请输入初始参数(如-d):"; $initialArg = trim(fgets(STDIN)); if (empty($initialArg)) { echo "参数不能为空,程序退出\n"; exit(1); } } else { $initialArg = $argv[1]; } // 根据初始参数给出反馈 echo "{$initialArg} was entered\n"; // 持续读取用户输入 $stdin = fopen('php://stdin', 'r'); while (true) { $line = trim(fgets($stdin)); // 空输入则退出程序 if (empty($line)) { fclose($stdin); exit(0); } // 解析输入的命令与参数,执行对应操作 $parts = explode(' ', $line, 2); $command = $parts[0]; $param = $parts[1] ?? ''; // 示例操作逻辑,可根据需求扩展 switch ($command) { case '-t': echo "t {$param} was entered\n"; break; case '-d': echo "d {$param} was entered\n"; break; default: echo "未知命令:{$command}\n"; } } ?>
关键说明
- 参数容错处理:启动时未传参数会提示用户补录,避免直接报错退出
- 空输入判断:用
trim()去掉换行符和首尾空格,确保仅按回车时能触发退出逻辑 - 命令解析:用
explode()拆分命令与参数,支持带参数的输入格式(如-t something) - 资源清理:退出前关闭STDIN流,保证系统资源正常释放
测试效果
执行php test.php -d后,控制台交互如下:
-d was entered -t something t something was entered (按回车,程序退出)
如果启动时未传参数:
php test.php 请输入初始参数(如-d):-s -s was entered -d test d test was entered (按回车,程序退出)
内容的提问来源于stack exchange,提问作者BlissSol
相关产品推荐
相关产品推荐

