PHP의 ftp_nb_get() 함수는 FTP 서버에 있는 파일을 로컬 시스템으로 다운로드할 때 사용합니다. 함수 이름의 'nb'는 non-blocking(비차단)을 의미하며, 다운로드가 진행되는 동안에도 스크립트가 멈추지 않고 다른 작업을 계속 수행할 수 있다는 점이 일반적인 ftp_get() 함수와의 큰 차이입니다.
문법
ftp_nb_get(con, local_file, server_file, transfer_mode, beg_pos);
매개변수
con − FTP 연결 리소스입니다.
local_file − 다운로드한 내용을 저장할 로컬 파일 경로입니다.
server_file − 서버에서 다운로드할 파일 경로입니다.
transfer_mode − 데이터 전송 모드를 지정합니다. 사용 가능한 값은 다음과 같습니다.
- FTP_ASCII
- FTP_BINARYbeg_pos − 다운로드를 시작할 위치(오프셋)입니다.
반환값
ftp_nb_get() 함수는 다음 세 가지 값 중 하나를 반환합니다.
FTP_FAILED − 송수신에 실패한 경우
FTP_FINISHED − 송수신이 완료된 경우
FTP_MOREDATA − 송수신이 아직 진행 중인 경우
예제
다음은 ftp_nb_get() 함수를 사용해 FTP 서버의 파일을 비동기 방식으로 다운로드하는 예제입니다.
<?php
$ftp_server = "192.168.0.4";
$ftp_user = "jacob";
$ftp_pass = "tywg61gh";
// FTP 서버에 연결
$con = ftp_connect($ftp_server) or die("$ftp_server 에 연결할 수 없습니다");
// 로그인
$login = ftp_login($con, $ftp_user, $ftp_pass);
$my_serverfile = "demo.txt"; // 서버 측 파일
$local_file = "new.txt"; // 저장할 로컬 파일
// 비동기(non-blocking) 다운로드 시작
$c = ftp_nb_get($con, $local_file, $my_serverfile, FTP_ASCII);
// 다운로드가 완료될 때까지 반복
while ($c == FTP_MOREDATA) {
// 다운로드 계속 진행
$c = ftp_nb_continue($con);
// 필요하다면 이 사이에 다른 작업을 함께 수행할 수 있습니다.
}
if ($c != FTP_FINISHED) {
echo "서버 파일 다운로드 중 오류가 발생했습니다!";
exit(1);
}
// FTP 연결 종료
ftp_close($con);
?>
위 예제의 동작 흐름을 살펴보면, 먼저 ftp_nb_get()으로 다운로드를 시작하고 반환값이 FTP_MOREDATA인 동안 ftp_nb_continue()를 반복 호출하여 다운로드를 이어갑니다. 다운로드가 정상적으로 끝나면 반환값은 FTP_FINISHED가 되고, 실패한 경우에는 FTP_FAILED가 반환되므로 이 값을 확인해 오류 처리를 할 수 있습니다. 이처럼 비차단 방식을 활용하면 대용량 파일을 다운로드하는 동안에도 진행 상태 표시 등 다른 작업을 병행할 수 있다는 장점이 있습니다.