2013-06-24 2 views
0

프로덕션 서버에 로그인하여 파일을 검색하고이 파일의 데이터로 데이터베이스를 업데이트해야합니다. 이 파일은 프로덕션 DB이므로 파일이 커질 수 있으므로 서버에 영향을 줄 수 있으므로 매 5 분마다 전체 파일을 가져 오지 않아도됩니다. 이 파일의 마지막 30 줄을 매 5 분 간격으로 가져와 가능한 한 작은 영향을 주어야합니다.어떻게하면 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

마크 B가 잘못되었습니다. SFTP는 부분 파일 전송을 완벽하게 지원합니다. 다음은 phpseclib, a pure PHP SFTP implementation으로 원하는 일을하는 방법의 예 : 일부 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는 Windows SFTP 서버에서 작동하지만 꼬리는 쉘 액세스가 있더라도 그렇게 할 수는 없습니다. 즉. 전반적으로 훨씬 더 휴대용 솔루션입니다.

파일의 마지막 x 줄을 가져 오려면 10x 줄 바꿈 문자가 나타날 때까지 매번 많은 바이트를 읽은 다음 반복적으로 반복 할 수 있습니다. 즉. 마지막 10 바이트를 얻은 다음 마지막 10 바이트 다음 10 바이트를 가져옵니다.

관련 문제