server_side

php 네트워크 프로그래밍 1

행복하자구요~ 2007. 12. 29. 15:20
PHP 네트워크 프로그래밍 - 1 

  네트워크 프로그래밍은 서버간의 연동, 서버와 클라이언트간의 연동을 자유롭게 보장해 줄 수 있는 거의 유일한(?) 수단으로 꼽히고 있다. 대형 프로젝트나 사이트에 투입되면 대개 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를 이용한 파일 업로드 기법을 추천한다.
태그에 ENCTYPE=‘multipart/form-data’의 속성을 추가해 주면 파일 업로드가 가능하다는 것을 독자들도 익히 알고 있을 것이다. 만일 업로드 용량 부족 같은 문제가 발생할 때 PHP.ini의 설정 파일에서 다음과 같이 처리하면 post로 넘기는 데이터의 양을 조절할 수 있다.

; Maximum size of POST data that PHP will accept.
post_max_size = 8M

잠시 유의해야 할 점은 앞의 설정은 POST로 값을 보낼 때의 허용된 용량을 말하는 것이다. 다시 말해 클라이언트(웹 브라우저)에서 넘길 수 있는 POST의 MAX 용량을 말하는 것이다. 이것은 텍스트 데이터가 될 수도 있고, 바이너리도 될 수 있다. 이와 달리 서버의 temp로 업로드될 수 있는 용량을 설정하는 부분도 있다. PHP.ini 파일에서 [File Upload] 섹션 부분을 살펴보면 다음과 같이 설정되어 있다. 이것을 조절하면 업로드 용량을 조절할 수 있다.

; Maximum allowed size for uploaded files.
upload_max_filesize = 5M

'server_side' 카테고리의 다른 글

php 네트워크 프로그래밍 3  (0) 2007.12.29
php 네트웍프로그래밍 2  (0) 2007.12.29
server 보호하기 from 해킹  (0) 2007.12.29
보안 -iptable을 통한 보안  (0) 2007.12.29
신촌수제비집-저렴^^  (0) 2007.12.08