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

PHP中fgets()函数返回异常结果的问题求助

PHP fgets循环输出异常排查

相关代码

#!/usr/bin/php
<?php

    define("KPA_PEOPLE","/devel/pic/snk_db2/KPA-migration/Keywords/gettingTheKeywordsAndFiles/KPA_People.txt");
    $hndl_kpa_people=fopen(KPA_PEOPLE,"r+") or die("Failed opening ".KPA_PEOPLE);
    while($line=fgets($hndl_kpa_people)!==FALSE){
        echo "\nline: ".$line."\n";
    }
?>

上下文信息

  • 文件权限及所属:-rw-r--r-- 1 snkdb snkdb 6096 dec 25 14:08 KPA_People.txt(当前运行用户为snkdb)
  • 文件内容示例:
et|2
Elisabet|3
okända|4...

实际运行结果

line: 1

line: 1

line: 1...

预期结果

line: et|2

line: Elisabet|3

line: okända|4... 

问题描述

我认为while($line=fgets($hndl_kpa_people)!==FALSE)的写法符合官方手册规范,且之前在其他脚本中能正常运行,但此次执行后输出全是1,和预期不符,求排查思路。


解决思路

问题核心是运算符优先级:!==的优先级高于=,原代码会先执行fgets($hndl_kpa_people) !== FALSE得到布尔值,再把这个布尔值赋值给$line。因为文件有可读内容,每次判断结果都是true,布尔值true输出时会被转为字符串1,所以出现了重复输出1的情况。

修正方法是给赋值表达式加括号,确保先完成赋值再做判断:

while( ($line = fgets($hndl_kpa_people)) !== FALSE ){
    echo "\nline: ".$line."\n";
}

另外,此场景仅需读取文件,用r模式替代r+更稳妥,可避免误修改文件内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:05:34