ftp_nb_fget() 함수는 FTP 서버에서 파일을 다운로드하여 이미 열려 있는 로컬 파일에 저장하는 PHP 내장 함수입니다. 함수 이름의 nb는 'non-blocking(비차단)'을 의미하며, 이 함수는 파일 전송이 완료될 때까지 기다리지 않고 즉시 반환합니다. 따라서 다운로드가 진행되는 동안에도 스크립트가 다른 작업을 동시에 수행할 수 있다는 큰 장점이 있습니다.
문법(Syntax)
ftp_nb_fget(con, open_file, server_file, transfer_mode, beg_pos);
매개변수(Parameters)
con − FTP 서버와의 연결 리소스입니다. ftp_connect() 함수로 생성한 연결을 사용합니다.
open_file − 다운로드한 데이터가 저장될 로컬 파일 포인터입니다. fopen()으로 미리 열어둔 파일이어야 합니다.
server_file − FTP 서버에서 다운로드할 파일의 경로입니다.
transfer_mode − 데이터 전송 모드를 지정합니다. 사용 가능한 값은 다음과 같습니다:
- FTP_ASCII (텍스트 모드)
- FTP_BINARY (바이너리 모드)
beg_pos − (선택 사항) 다운로드를 시작할 파일 내 위치입니다. 이전에 중단된 다운로드를 이어받을 때 유용합니다.
반환 값(Return Value)
ftp_nb_fget() 함수는 아래 세 가지 값 중 하나를 반환합니다:
FTP_FAILED − 전송(송신/수신)이 실패했음을 의미합니다.
FTP_FINISHED − 전송이 성공적으로 완료되었음을 의미합니다.
FTP_MOREDATA − 전송이 아직 진행 중임을 의미합니다. 이 경우 ftp_nb_continue()를 호출하여 다운로드를 계속 진행해야 합니다.
사용 예제
다음은 ftp_nb_fget() 함수를 사용하여 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"; // 저장될 로컬 파일
// 로컬 파일 열기
$file_pointer = fopen($local_file, "w");
// 비동기 다운로드 시작
$c = ftp_nb_fget($con, $file_pointer, $my_serverfile, FTP_BINARY);
// 다운로드가 진행되는 동안 반복 처리
while ($c == FTP_MOREDATA) {
// 이 부분에서 다른 작업을 수행할 수 있습니다
$c = ftp_nb_continue($con);
}
if ($c != FTP_FINISHED) {
echo "서버 파일 다운로드 중 오류가 발생했습니다!";
exit(1);
}
// 연결 종료 및 파일 닫기
ftp_close($con);
fclose($file_pointer);
?>
참고 사항
일반적인 ftp_fget() 함수는 다운로드가 완료될 때까지 스크립트 실행을 차단(blocking)하지만, ftp_nb_fget()은 FTP_MOREDATA를 반환하며 즉시 제어권을 돌려줍니다. 따라서 대용량 파일을 다운로드하면서 진행 상황을 표시하거나 다른 작업을 병렬로 처리해야 하는 상황에서 특히 유용하게 활용할 수 있습니다.