1

我想从使用 PHP 的 SFTP 服务器的大文件 (30MB) 中获取最后 15 行。

我尝试使用 phpseclib 的 SFTP 功能,如下所示:

include('./Net/SFTP.php');
$sftp = new Net_SFTP("server", 2022);
if (!$sftp->login('username', 'password')) {
    exit("Login error");
}
$size = $sftp->size('./file.txt');
$Container = nl2br($sftp->get('./file.txt', false, $size - 5000));
if( !empty($Container) ) {
    echo $Container;
} else {
    exit("empty file");
}

但是对于我的大文件,这仍然会在 2 分钟内加载。

是否可以从大文件中仅获取最后 X 行?

4

1 回答 1

3

以下内容应该会产生一个文本块,其中距文件末尾至少 15 行,然后您可以使用现有逻辑进一步处理。您可能需要根据文件是否以尾随换行符等结尾来调整一些逻辑。

$filename = './file.txt'

$filesize = $sftp->size($filename);
$buffersize = 4096;

$offset = $filesize; // start at the end
$result = '';
$lines = 0;

while( $offset > 0 && $lines < 15 ) {
  // work backwards
  if( $offset < $buffersize ) {
    $offset = 0;
  } else {
    $offset -= $buffer_size;
  }
  $buffer = $sftp->get($filename, false, $offset, $buffer_size));
  // count the number of newlines as we go
  $lines += substr_count($buffer, "\n");
  $result = $buffer . $result;
}
于 2019-01-23T23:46:45.277 回答