使用phpseclib从SFTP中的大文件中获取最后15行

时间:2019-01-23 21:10:39

标签: php sftp phpseclib

我想使用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行?

1 个答案:

答案 0 :(得分: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;
}