在 PHP8.0.1 的先前版本中使用 fseek 存在一个错误。
参见
https://bugs.php.net/bug.php?id=46569
https://3v4l.org/O89dJ
我用一个函数解决了它
<?php
/**
* 在 Spl 对象上执行 SEEK
* PHP 中存在一个用于搜索文件的错误
* 似乎已在 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);
}
}
}?>