在PHP8.0.1之前的版本中使用fseek存在一个bug。
参见
https://bugs.php.net/bug.php?id=46569
https://3v4l.org/O89dJ
我用一个函数解决了这个问题
<?php
/**
* 搜索Spl对象
* PHP中存在一个用于搜索文件的bug
* php_version > PHP8.0.1似乎已解决
* 参见 https://bugs.php.net/bug.php?id=46569
* & https://3v4l.org/O89dJ
*
* $Spl->seek() 在所有版本中都能正常工作,偏移量为0(第一行)
* 在PHP_VERSION < 8.0.1中:
* - 偏移量1:seek()无法跳转到第1行。它将手动完成,回绕文件并读取第一行
* - 其他的偏移量:光标停留在$Offset的下一行
*
* @param SplObject $Spl
* @param int $Offset
*/
function seek_spl($Spl, $Offset){
if (version_compare(PHP_VERSION, '8.0.1', '>=') || $Offset == 0) {
$Spl->seek($Offset);
} else {
if( $Offset == 1 ){
$Spl->rewind(); // 确保在退出之前转到第一行
$Spl->fgets(); // 读取第0行。光标现在停留在第1行
} else {
$Spl->seek($Offset-1);
}
}
}?>