如何在PHP中逐行读取文件且避免重复批处理代码?
解决PHP批处理中EOF检测不触发的问题
原代码里的or (count($addresses) and feof($fh))条件之所以不生效,核心原因是PHP的feof()只有在调用fgets()返回false之后才会标记文件为EOF状态。也就是说,当你读取到最后一行有效数据时,feof($fh)仍然是false,必须再执行一次fgets()拿到false,feof才会变成true——但这时候你已经退出循环了,自然触发不了批处理逻辑。
不想在循环后重复调用record()?可以试试这两种方案:
方案一:调整循环结构,在读取失败时直接处理剩余数据
把读取和批处理判断整合到do-while循环里,这样当读取到EOF(fgets()返回false)时,直接触发剩余数据的处理:
$fh = fopen('your_file.txt', 'r'); $addresses = []; $limit = 100; $success = true; do { $line = fgets($fh); // 读取到有效行时加入数组 if ($line !== false) { $addresses[] = $line; } // 满足以下任一条件就处理批数据: // 1. 读取到文件末尾($line为false) // 2. 当前批次数量达到上限 if ($line === false || count($addresses) === $limit) { if (!empty($addresses)) { $success = record($addresses); if (!$success) break; $addresses = []; } } } while ($line !== false); fclose($fh);
方案二:封装批处理逻辑,避免重复代码
如果还是想用while循环,把处理$addresses的逻辑封装成一个小函数,这样就算循环后再调用一次,代码也不会冗余:
function processBatch(&$addresses) { if (empty($addresses)) return true; $success = record($addresses); $addresses = []; return $success; } $fh = fopen('your_file.txt', 'r'); $addresses = []; $limit = 100; $success = true; while (($line = fgets($fh)) !== false && $success) { $addresses[] = $line; if (count($addresses) === $limit) { $success = processBatch($addresses); } } // 处理最后一批不满上限的数据 processBatch($addresses); fclose($fh);
这两种方案都能避免原代码里依赖feof()的坑,而且不用纠结重复调用record()的问题。
内容的提问来源于stack exchange,提问作者Shovas
相关产品推荐
相关产品推荐

