php2012. 10. 8. 13:41

서버를 분리하면서 알게된 방법입니다. 

디비 서버를 분리하는 것은 별문제가 아니지만 

웹서버와 이미지 서버를 분리할 때는 그리 간단하지 않을 것이라 생각하는데요. 

웹서버가 첨부파일을 받아서 이미지 서버로 전송해 주어야하는데 

PHP의 FTP 관련 함수로 실시간으로 전송하는 방법으로 구현했습니다. 

자료를 찾아보니 PHP 4.xx 버젼에서는 속도가 느리다는 지적이 있었는데요 

실제로 PHP 4.4xx 버전에서 테스트 해보니 접속 속도가 조금 떨어지더군요 

그래도 어느정도 쓸만하다고 생각됐구요. 
  

PHP 5.1.4 버젼에서 해보니 실시간으로 로컬에서 저장하는 것처럼 

속도의 문제가 없어 권해드립니다. 

아래는 제가 사용하는 전송 프로그램입니다. 

여러개 파일을 한꺼번에 전송할 수 있도록 했습니다. 

img 라는 디렉토리에 a.jpg b.jpg c.jpg 파일을 전송한다면 

파일은 , 로 구분하고 서브 디렉토리 생성이 필요할 경우 thum/e.jpg 식으로 하시면 

디렉토리가 생성되도록 했습니다. 


$ftp_host = ""; 
$ftp_user = ""; 
$ftp_pass = ""; 

내용을 설정하시구요. 

// $files = "a.jpg,thum/b.jpg,orig/c.jpg"; // 서브 디렉토리의 형식도 가능  
$files = "a.jpg,b.jpg,c.jpg";  // 전송할 파일들 
$source_dir = "img"; // 파일 저장 디렉토리 
$target_dir = "img"; // FTP 서버로 전송할 디렉토리 

ftp_upload($files,$source_dir,$target_dir); 

이런식으로 사용하시면 됩니다. 
참고로 100개 파일씩 루프로 전송을 해보았는데 
전혀 문제가 없었습니다. 


function ftp_upload($files,$source_dir,$target_dir){ // files 에서 (,)로 구분 

    $ftp_host = ""; 
    $ftp_user = ""; 
    $ftp_pass = ""; 

    $result = 0; 

    $conn_id = ftp_connect($ftp_host); // FTP 서버 연결 
    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // 접속 

    if(!$conn_id || !$login_result) return;  // 접속실패시 결과 반환 

    $dir = ftp_chdir($conn_id, $target_dir); // 해당 디렉토리로 이동 
     
    $files = explode(',',$files); // 파일구분 
     
    foreach($files as $file){ 

        $file = trim($file); 
        $d =  explode('/',$file); // 서브 디렉토리 
         
        if(count($d)>1){ 
             
            $dir_sub = ""; 

            for($i=0;$i<count($d)-1;$i++){ 

                if($dir_sub){ $dir_sub .= "/".$d[$i]; } 
                else{ $dir_sub = $d[$i]; } 

                @ftp_mkdir($conn_id, $dir_sub);  // 서브 디렉토리가 없을 경우 생성 
            }     
        } 

        $up = ftp_put($conn_id, $file, $source_dir."/".$file, FTP_BINARY); // 파일 전송 

        //echo "$up = $source_dir/$file -> $target_dir/$file<br>\n"; 

        if($up){ $result++; } 
    } 

    ftp_close($conn_id); //연결 끊기 

    return $result; 



PS  서버를 분리하는데 좋은 팁있으며 부탁드립니다.

'php' 카테고리의 다른 글

php.ini설정 - display_errors(php 에러 출력 설정)  (0) 2012.10.11
서버 분배(로드밸런싱... )  (0) 2012.10.09
php 썸네일 이미지 만들기  (0) 2012.09.29
코드이그나이터 한국 포럼  (0) 2012.09.24
파일 존재 여부 함수  (0) 2012.09.10
Posted by 다오나무