네트워크 프로그래밍은 서버간의 연동, 서버와 클라이언트간의 연동을 자유롭게 보장해 줄 수 있는 거의 유일한(?) 수단으로 꼽히고 있다. 대형 프로젝트나 사이트에 투입되면 대개 TCP/IP나 UDP 연동에 대한 제안을 받게 된다. 많은 프로젝트를 진행하면서 느낀 점은 아주 기본적인 원칙(전제)이 시스템간의 유연하고 견고한 인터페이스를 만든다는 것이다. 이러한 인터페이스가 기본이 되어야만 이후 유저 인터페이스 및 통계 자료에 접근할 수 있다는 것이다. 기본적인 데이터가 축적되지 않으면 데이터를 응용하는 응용 프로그램을 개발하기 어렵듯이 각종 프로젝트들은 다양한 시스템과의 연동을 필요로 한다. 이런 관점을 잘 이해하고 PHP로 접근할 수 있거나 해결할 수 있는 방법을 익혀두어서 프로젝트에 유용하게 사용했으면 한다.
실제로 필자는 프로젝트에서 이런 인터페이스를 잘 이해하지 못한 덕분(?)에 서로 다른 프로그래밍 언어로 개발함으로써 시간을 지연시키거나 전체 시스템 구성도를 깔끔하게 그리지 못한 경우가 있었다. 프로그래밍 언어를 가리지 않는 것만큼 자신이 사용하고 있는 프로그래밍 언어를 잘 사용하는 것도 개발 시간 및 구성에서 많은 효율성을 준다. 이번 호에서는 FTP를 이용한 파일 업로드 핸들링, SMTP를 이용한 메일 전송, 소켓을 이용한 TCP/IP, UDP 프로그래밍, SNMP(Simple Network Management Protocol)를 이용한 시스템 모니터링 등을 소개고자 한다. 복잡하고 정교한 프로그램보다는 간단한 아키텍처에 기반한 애플리케이션을 만들어 봄으로써 이후 다른 곳에 응용할 수 있는 예제로 다루겠다.
파일 전송 인터페이스 만들기 FTP는 아주 오래된 프로토콜이지만 아직도 많은 프로젝트에서 사용되는 범용적인 프로토콜이다. 애플리케이션이 현재처럼 개발되지 않았을 시에는 콘솔에서 일일이 로그인하는 과정과 검색 및 업/다운을 진행했지만 요즘에는 그런 명령어조차 기억할 필요없을 정도로 편한 인터페이스가 많이 개발되었다. FTP는 프로젝트에서 데이터의 이중 백업이나 파일의 이동을 필요로 하는 기능을 구현하는데 유용하다. 가장 기본적인 FTP 프로토콜 아키텍처는 로그인→디렉토리찾기→파일찾기→업로드(다운로드)→로그아웃 과정이다. PHP에서는 간단하게 몇 줄만으로 이 과정을 프로그래밍할 수 있다. 다음의 코드를 보자.
<?
$connect = ftp_connect ("시스템아이피","21");
ftp_login( $connect, "아이디", "패스워드");
ftp_chdir($connect,"찾아갈 디렉토리명");
ftp_get($connect, "로컬경로/파일명","원격경로/파일명" , FTP_BINARY);
ftp_close($connect);
?>
이처럼 간단히 5줄의 코딩으로 파일을 가져오는 프로그램을 만들 수 있다. 하지만 웹상의 서버에서 운영되는 프로그램의 특징으로 에러가 나타나는 경우가 아주 많다. 실제 성공률에 대한 보장도 고려해야 한다. 무엇보다 에러 핸들링이 중요하다는 것을 프로젝트를 진행하면서 자주 느끼게 될 것이다. 다음의 코드처럼 보정하여 에러 처리에 대한 루틴을 강화하도록 하자.
<?
$connect = ftp_connect("시스템아이피“,”21“);
// 아이디와 패스워드를 통한 로그인 체크
$login_result = ftp_login($connect, "아이디“, ”패스워드“);
// 연결 체크
if ((!$connect) || (!$login_result)) {
echo "FTP 연결이 실패하였습니다";
echo "시스템 아이피 및 로그인 정보를 확인하십시오";
exit;
} else {
echo "로그인에 성공하였습니다.";
}
//파일 업로드일 경우
$process = ftp_put($connect, "원격경로/업로드파일명","로컬경로/업로드파일명", FTP_BINARY);
//다운로드일 경우
$process = ftp_get($connect, "로컬경로/파일명","원격경로/파일명", FTP_BINARY);
// 업로드 다운로드 체크
if (!$process) {
echo "FTP 처리가 실패하였습니다";
//----> 실패에 대한 처리 루틴
//<---- db나 설정 파일에 대한 처리
} else {
echo "FTP 처리가 성공하였습니다";
}
// FTP 스트림 닫기
ftp_close($connect);
?>
필자가 가장 많이 경험한 것은 실제 파일 업로드가 웹에서 잘 진행되지 않는 점이었다. 이것은 네트워크 속도 및 PHP 파서의 실행 시간과 관련이 높다. 실제 안정적으로 프로그램을 구현하기 위해서는 웹 서버의 속도 보정과 PHP 파서의 실행시간(기본 30초로 설정되어 있음)을 늘려주는 것도 FTP를 안정적으로 진행할 수 있게 한다. 요즘 각 회사마다 네트워크 구성을 보면 기본적으로 FTP를 막아 놓은 곳이 많다. 기본적인 21번 FTP가 막혀 있을 때는 HTTP를 이용한 파일 업로드 기법을 추천한다.
| |