1

I need to login to a production server retrieve a file and update my data base with the data in this file. Since this is a production database, I don't want to get the whole file every 5 minutes since the file may be huge and this may impact the server. I need to get the last 30 lines of this file every 5 minutes interval and have as little impact as possible.

The following is my current code, I would appreciate any insight to how best accomplish this:

<?php

$user="id";
$pass="passed";
$c = curl_init("sftp://$user:$pass@server1.example.net/opt/vmstat_server1");
curl_setopt($c, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($c);
curl_close($c);
$data = explode("\n", $data);
?>
4

3 回答 3

7

马克 B 错了。SFTP 完全能够进行部分文件传输。这是一个示例,说明如何使用phpseclib(纯 PHP SFTP 实现)执行您想要的操作:

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

$size = $sftp->size('filename.remote');

// outputs the last ten bytes of filename.remote
echo $sftp->get('filename.remote', false, $size - 10);
?>

事实上,无论如何我都会推荐这样的方法,因为某些 SFTP 服务器不允许您通过系统 shell 运行命令。另外,SFTP 可以在 Windows SFTP 服务器上运行,而即使您有 shell 访问权限,tail 也不太可能这样做。IE。总的来说,它是一个更便携的解决方案。

如果您想获取文件的最后 x 行,您可以重复循环,每次读取多少字节,直到遇到 10x 个换行符。IE。获取最后 10 个字节,然后是最后 10 个字节的下一个,然后是这 10 个字节之前的 10 个字节,依此类推。

于 2013-06-25T14:53:58.690 回答
0

@Sammitch对重复问题的回答Get last 15 lines from a large file in SFTP with phpseclib

以下内容应该会产生一个文本块,其中距文件末尾至少 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-30T08:19:38.307 回答
-1

SFTP 不能进行部分文件传输。使用完整的 SSH 连接并使用远程 'tail' 操作获取文件的最后几行可能会更好,例如

$lines = shell_exec("ssh user@remote.host 'tail -30 the_file'");

当然,您可能想要一些更强大的东西来处理诸如阻止 ssh 通过的 net.glitches 之类的事情,但作为一个基本的起点,这应该可以解决问题。

于 2013-06-24T19:31:07.350 回答