현재 위치: > 최신 기사 목록> FSOCCKOPEN 기능을 통해 FTP 파일 업로드를 구현하는 자세한 방법은 무엇입니까? 어떤 핵심 요점에주의를 기울여야합니까?

FSOCCKOPEN 기능을 통해 FTP 파일 업로드를 구현하는 자세한 방법은 무엇입니까? 어떤 핵심 요점에주의를 기울여야합니까?

gitbox 2025-08-25

PHP에서 FTP 파일 업로드를 구현하기 위해 FSOCCKOPEN () 함수를 사용하는 프로세스는 FTP 프로토콜의 수동 작업과 관련된 상대적으로 낮은 수준입니다. PHP는 FTP 업로드 프로세스를 단순화하기 위해 FTP_* 일련의 기능을 제공하지만 때로는 특수 요구 사항을 발견하거나 업로드 프로세스를보다 세분화하기 위해 FSOCCKOPEN () 을 통해 직접 구현하도록 선택하십시오. 이 기사는 fsocckopen () 을 통해 FTP 파일 업로드를 구현하는 방법을 자세히 소개하고 특별한주의가 필요한 몇 가지 핵심 사항을 지적합니다.

1. 기본 개념

FTP (파일 전송 프로토콜)는 클라이언트와 서버간에 파일을 전송하는 데 사용되는 일반적으로 사용되는 네트워크 프로토콜입니다. FSOCCKOPEN () 함수를 사용하면 FTP 서버와 상호 작용하여 업로드, 다운로드 및 기타 작업을 수행 할 수 있도록 PHP의 FTP 서버에 소켓 연결을 열 수 있습니다.

2. fsocckopen () 을 통해 파일을 업로드하는 기본 프로세스

  1. 연결 <br> 먼저 FTP 서버에 대한 연결을 열려면 fsocckopen ()을 사용해야합니다. 일반적으로 FTP 서버의 기본 포트는 21입니다.

     <span><span><span class="hljs-variable">$ftp_server</span></span><span> = </span><span><span class="hljs-string">'ftp.example.com'</span></span><span>;
    </span><span><span class="hljs-variable">$ftp_port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>;
    </span><span><span class="hljs-variable">$ftp_user</span></span><span> = </span><span><span class="hljs-string">'username'</span></span><span>;
    </span><span><span class="hljs-variable">$ftp_pass</span></span><span> = </span><span><span class="hljs-string">'password'</span></span><span>;
    
    </span><span><span class="hljs-comment">// 창조FTP서버 연결</span></span><span>
    </span><span><span class="hljs-variable">$ftp_socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>, </span><span><span class="hljs-variable">$ftp_port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$ftp_socket</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"FTP연결이 실패했습니다: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)");
    }
    </span></span>
  2. 서버 응답을받습니다
    FTP는 일반적으로 연결이 설정되면 환영 메시지를 보냅니다. 성공적인 연결을 위해 서버의 응답을 읽고 확인해야합니다.

     <span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'220'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"연결이 실패했습니다: <span class="hljs-subst">$response</span></span></span><span>");
    }
    </span></span>
  3. 사용자 이름과 비밀번호를 보내십시오 <br> FTP 프로토콜에서 로그인 프로세스는 사용자 이름 (사용자) 및 암호 (Pass) 명령을 보내면 수행됩니다. fputs () 함수를 사용 하여이 명령을 보낼 수 있습니다.

     <span><span><span class="hljs-comment">// 사용자 이름을 보내십시오</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"USER <span class="hljs-subst">$ftp_user</span></span></span><span>\r\n");
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'331'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"사용자 이름의 오류: <span class="hljs-subst">$response</span></span></span><span>");
    }
    
    </span><span><span class="hljs-comment">// 비밀번호를 보내십시오</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"PASS <span class="hljs-subst">$ftp_pass</span></span></span><span>\r\n");
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'230'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"오류 비밀번호: <span class="hljs-subst">$response</span></span></span><span>");
    }
    </span></span>
  4. 수동 모드 설정 (선택 사항)
    일부 네트워크 환경에서 PASV (Passive Mode)를 사용하는 것이 더 안정적입니다. 패시브 모드는 FTP 서버쪽에 새 포트를 열고 클라이언트는 데이터 전송을 위해이 포트에 연결합니다.

     <span><span><span class="hljs-comment">// 수동 모드로 들어갑니다</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"PASV\r\n"</span></span><span>);
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'227'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"수동 모드로 들어갑니다失败: <span class="hljs-subst">$response</span></span></span><span>");
    }
    </span></span>

    서버에서 반환 한 응답에는 데이터 포트에 대한 정보가 포함되며 데이터 포트를 얻으려면이 응답을 구문 분석해야합니다.

  5. 파일 업로드 <br> 파일을 업로드하려면 파일의 업로드 위치를 지정하려면 스토어 명령을 보내고 파일 콘텐츠를 블록으로 서버 블록으로 전송해야합니다.

     <span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'local_file.txt'</span></span><span>;
    </span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'remote_file.txt'</span></span><span>;
    
    </span><span><span class="hljs-comment">// 로컬 파일을 엽니 다</span></span><span>
    </span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$file</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法로컬 파일을 엽니 다: <span class="hljs-subst">$local_file</span></span></span><span>");
    }
    
    </span><span><span class="hljs-comment">// 보내다 STOR 명령 업로드가 시작됩니다</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"STOR <span class="hljs-subst">$remote_file</span></span></span><span>\r\n");
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'150'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"업로드하지 못했습니다: <span class="hljs-subst">$response</span></span></span><span>");
    }
    
    </span><span><span class="hljs-comment">// 파일 내용을 블록별로 업로드하십시오</span></span><span>
    </span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
        </span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
        </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
    }
    
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
    </span></span>
  6. 연결을 닫습니다 <br> 파일을 업로드 한 후 FTP 연결을 닫으십시오.

     <span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"QUIT\r\n"</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>);
    </span></span>

3. 핵심 요점 및 예방 조치

  1. 오류 처리
    FTP 프로토콜에는 여러 명령 및 응답이 포함되므로 오류 처리가 매우 중요합니다. 각 FTP 명령의 응답에는 3 자리 상태 코드 (예 : 220 , 230 , 331 등)가 포함됩니다. 이러한 상태 코드를 확인하면 작업이 성공했는지 여부를 결정할 수 있습니다.

  2. 수동 모드 및 활성 모드 <br> 일부 네트워크 환경에서 수동 모드를 사용하면 NAT (네트워크 주소 변환) 장치 및 방화벽의 차단을 피할 수 있습니다. 기본 모드가 적합하지 않은 경우 수동 모드로 전환하십시오.

  3. 이진 및 ASCII 모드 <br> 파일을 업로드 할 때는 파일 전송 모드의 올바른 설정을 확인해야합니다. 바이너리 파일 (예 : 그림, 비디오, 압축 파일 등)의 경우 바이너리 모드 (예 : 유형 I )를 사용해야합니다. 텍스트 파일의 경우 ASCII 모드 (즉, A 형 )를 사용하십시오.

  4. 버퍼 크기 <br> 파일 업로드 중에 작업을 읽고 쓰는 경우 버퍼 크기를 조정하여 업로드 성능을 향상시킬 수 있습니다. Fread ()fputs () 의 버퍼 크기는 데이터 전송 속도에 영향을 미칩니다.

  5. 자원 누출 방지 <br> fsocopen () 을 통해 소켓 연결을 만든 후 리소스 누출을 피하기 위해 업로드가 완료된 후 연결을 닫아야합니다.

4. 요약

fsocckopen () 을 통해 FTP 파일 업로드를 구현하는 것은 상대적으로 낮은 수준이지만 개발자에게 파일 전송을보다 제어 할 수있게합니다. FTP 프로토콜의 각 단계를 수동으로 구현함으로써 복잡한 시나리오에서 맞춤형 작업을 수행 할 수 있습니다. 그러나이를 사용할 때는 업로드 프로세스의 원활한 진행 상황을 보장하기 위해 프로토콜, 오류 처리, 전송 모드 및 기타 문제의 세부 사항에주의를 기울여야합니다. 일반 파일 업로드 요구 사항의 경우 PHP의 내장 FTP 기능을 사용하여 작업을 단순화하는 데 사용할 수 있으며 FSOCCKOPEN ()을 통한 사용자 정의 업로드 작업은보다 자세한 제어가 필요한 시나리오에 적합합니다.

  • 관련 태그:

    FTP