Windows PowerShell执行PHP脚本结果与PHPStorm不一致问题排查
PowerShell与PHPStorm执行PHP脚本结果不一致的原因分析
问题场景
Windows 11系统中,使用同一路径的PHP 8.1.13版本,在PowerShell执行脚本时输出不符合预期,但PHPStorm中执行结果正常。
代码示例
<?php fscanf(STDIN,"%d",$x); $tab=array(); for ($i=0;$i<$x;$i++){ $row = stream_get_line(STDIN,6+1,"\n"); $tab[] = $row.(strrev($row)); } echo("\n"); foreach ($tab as $x){ echo($x."\n"); } foreach (array_reverse($tab) as $x){ echo($x."\n"); }
PowerShell执行结果
PS C:\wamp64\www\> php tablereverse.php 2 ab bb ba bb bb ba
PHPStorm执行结果
C:\wamp64\bin\php\php8.1.13\php.exe C:\wamp64\www\tableReverse.php 2 ab bb abba bbbb bbbb abba
PHP版本信息
PS C:\wamp64\www\> php -v PHP 8.1.13 (cli) (built: Nov 22 2022 15:49:14) (ZTS Visual C++ 2019 x64) Copyright (c) The PHP Group Zend Engine v4.1.13, Copyright (c) Zend Technologies with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies
原因分析
核心问题出在Windows下不同终端的换行符处理差异:
- Windows系统默认换行符是
\r\n(回车+换行),但你在stream_get_line中指定的行分隔符是\n(仅换行)。 - PHPStorm的终端会将输入换行转换为
\n,所以stream_get_line能正确读取到完整的输入内容(如"ab"),无多余字符。 - PowerShell中输入的换行是完整的
\r\n,stream_get_line遇到\n就停止读取,导致$row末尾带有\r字符。执行strrev($row)时,\r会被移到字符串开头,输出时\r会让光标回到行首,覆盖前面的内容,最终看起来只显示了反转后的后半部分(比如"ab"变成"ba",实际是"ab\r"反转成"\rba",光标回位后"ba"覆盖了原有位置)。
解决方案
有三种可行的修复方式:
- 使用系统适配的换行符:用
PHP_EOL替代硬编码的"\n",它会根据当前系统自动选择正确的换行符:$row = stream_get_line(STDIN, 6+1, PHP_EOL); - 过滤多余的回车符:读取后用
rtrim去掉末尾的\r:$row = rtrim(stream_get_line(STDIN, 6+1, "\n"), "\r"); - 改用
fgets()函数:fgets()会自动处理系统换行符,只需额外去除换行相关字符:$row = rtrim(fgets(STDIN), "\r\n");
内容的提问来源于stack exchange,提问作者JBB
相关产品推荐
相关产品推荐

