You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"覆盖了原有位置)。

解决方案

有三种可行的修复方式:

  1. 使用系统适配的换行符:用PHP_EOL替代硬编码的"\n",它会根据当前系统自动选择正确的换行符:
    $row = stream_get_line(STDIN, 6+1, PHP_EOL);
    
  2. 过滤多余的回车符:读取后用rtrim去掉末尾的\r:
    $row = rtrim(stream_get_line(STDIN, 6+1, "\n"), "\r");
    
  3. 改用fgets()函数:fgets()会自动处理系统换行符,只需额外去除换行相关字符:
    $row = rtrim(fgets(STDIN), "\r\n");
    

内容的提问来源于stack exchange,提问作者JBB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:20:27