PHP 获取多行打开文件句柄的最后一行

PHP get the last line of an open file handle with multiple lines

这看起来应该是一件简单的事情,但是当 return 处理打开文件句柄的最后一行时,我在使用 fgetc() 时遇到了一些麻烦。我想要做的是 return 写入句柄的最后一行,如果句柄只有一行,我有以下内容:

function getLastLineFromHandle($handle)
{

    $seeker = function($handle) use (&$seeker) {

        fseek($handle, -1, SEEK_CUR);

        return ftell($handle) ?
            $seeker($handle) :
            $handle;
    };

    return trim(fgets($seeker($handle)));
}

$handle = fopen('php://temp', 'w+');
fwrite($handle, 'Hello World'.PHP_EOL);

//prints Hello World
print getLastLineFromHandle($handle);

问题是当我将多行写入句柄时,将 fgetc() 添加到检查条件似乎不起作用,例如:

function getLastLineFromHandle($handle)
{

    $seeker = function($handle) use (&$seeker) {

        fseek($handle, -1, SEEK_CUR);

        return ftell($handle) && fgetc($handle) != PHP_EOL ?
            $seeker($handle) :
            $handle;
    };

    return trim(fgets($seeker($handle)));
}

如果向句柄写入多行并且 fgetc($handle) 似乎每次都 return 相同的字符,则此 return 为空白?

我确定我错过了一些非常简单的事情,但是任何指示都会很棒,因为这让我发疯!

谢谢。

发现上面示例中缺少的内容,结果是在开始时指针处存在意外的行尾字符,因此移动一个位置解决了问题,例如:

function getLastLineFromHandle($handle)
{
    $seeker = function($handle) use (&$seeker) {
        fseek($handle, -2, SEEK_CUR);

        return ftell($handle) && fgetc($handle) != PHP_EOL ?
            $seeker($handle) :
            $handle;
    };

    return trim(fgets($seeker($handle)));
}

在探索这个的同时,我还发现了另一种做同样事情的方法,感谢@TheMarlboroMan 关于寻求结束的评论引发了这个:

function getLastLineFromHandle($handle)
{
    $seeker = function($handle, $cur = -2, $line = '') use (&$seeker)
    {
        $char = '';
        if (fseek($handle, $cur, SEEK_END) != -1) {
            $char = fgetc($handle);
            $line = $char.$line;
        }

        return ftell($handle) > 0 && $char != PHP_EOL?
            $seeker($handle, $cur-1,$line) :
            $line;
    };

    return trim($seeker($handle));
}

这还没有经过重构循环,但是它通过了与上述其他方法相同的测试。这个解决方案似乎有点混乱 return 行字符串而不是文件句柄,因为那是你所期望的。

将此设置为已解决,但如果有人有不同的方法,欢迎发表评论:)