2013-06-24 64 views
0

我需要登录到生产服务器检索文件并使用此文件中的数据更新我的数据库。由于这是一个生产分贝,我不想每隔5分钟就得到整个文件,因为文件可能很大,这可能会影响服务器。我需要每隔5分钟获取一次该文件的最后30行,并尽可能减少影响。如何通过php中的sftp获取最后一行文件

下面是我当前的代码,我将不胜感激任何见解如何最好地实现这一点:

<?php 

$user="id"; 
$pass="passed"; 
$c = curl_init("sftp://$user:[email protected]/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); 
?> 
+0

您是否有能力修改服务器上的代码?这将有可能实现服务器端,而不是客户端。 – lonesomeday

回答

0

SFTP不能够部分文件传输。使用fullblowin SSH连接可能会有更好的运气,并使用远程“尾部”操作来获取文件的最后一行,例如

$lines = shell_exec("ssh [email protected] 'tail -30 the_file'"); 

当然,你可能想的东西,可以处理诸如防止SSH从通过获得net.glitches事情更加强劲,但作为一个基本的出发点,这应该做的伎俩。

+0

谢谢你的工作。 – user1471980

5

Marc B是错的。 SFTP完全有能力进行部分文件传输。这里有一个如何做你想要什么phpseclib, a pure PHP SFTP implementation一个例子:

<?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访问权限,尾部也不太可能这样做。即。总的来说,这是一个更便携的解决方案。

如果你想获得一个文件的最后x行,你可以重复循环,每次读取很多字节,直到遇到10x新行字符。即。得到最后10个字节,然后是最后10个字节,然后是这10个字节之前的10个字节等。

相关问题