PHP修改file_reader读取行数参数仍输出全部3行内容问题排查
问题根因
传参修改后输出行数不变,核心是两处代码逻辑问题:
- 直接原因:
file_reader虽然声明了$num_lines入参,但函数内部完全没用到这个参数做行数限制。现有循环判断是!feof($file),逻辑是只要没读到文件末尾就一直逐行输出,和你传的行数参数没有任何关联,所以不管传2还是3,都会把整个文件的内容全部读出来打印。 - 附带的写法问题:
file_writer存在冗余逻辑,你先调用fopen以w模式打开文件(该模式会自动清空文件原有内容),之后又调用本身就自带完整文件写入能力的file_put_contents重复写文件,最后还手动fclose,属于多余操作——file_put_contents本身会自动完成打开、写入、关闭全流程,不需要手动操作文件句柄。另外原file_reader读完文件也没调用fclose释放句柄,存在资源泄漏风险。
修复后代码
$my_content = "This is the first line\n This is the second line\n This is the third line\n"; $my_filename = "save.txt"; function file_writer(string $file_to_write, string $content_to_write){ file_put_contents($file_to_write, $content_to_write); } file_writer($my_filename, $my_content); function file_reader(string $file_to_read, int $num_lines) { $file = fopen($file_to_read, "r"); $read_count = 0; // 同时满足「没到文件末尾」「已读行数小于要求行数」才继续读 while(!feof($file) && $read_count < $num_lines) { $line = fgets($file); echo $line; $read_count++; } fclose($file); } // 传2就输出前2行,传3就输出全部3行 file_reader($my_filename, 2);
修复逻辑说明:给读取流程加了行计数器,每成功读一行计数器加1,达到传入的
$num_lines阈值就立刻终止循环,不会再读完整个文件;同时补上了缺失的文件句柄关闭逻辑,移除了写入函数里的冗余操作。
内容的提问来源于stack exchange,提问作者avvvv
相关产品推荐
相关产品推荐

