현재 위치: > 최신 기사 목록> FTP_RAWLIST를 결합하여 자동 배포 스크립트를 작성합니다

FTP_RAWLIST를 결합하여 자동 배포 스크립트를 작성합니다

gitbox 2025-06-17

1. 준비

먼저 PHP 환경에서 FTP 기능을 지원하는지 확인해야합니다. 활성화 여부를 확인할 수 있습니다.

 <span><span><span class="hljs-title function_ invoke__">phpinfo</span></span><span>();
</span></span>

FTP 확장이 활성화되어 있는지 확인하려면 출력에서 ​​FTP 섹션을 찾으십시오. 활성화되지 않으면 php.ini 파일을 수정하여 확장자를 활성화 할 수 있습니다.

 <span><span><span class="hljs-attr">extension</span></span><span>=ftp
</span></span>

그런 다음 웹 서버를 다시 시작하십시오.

2. FTP 서버에 연결하십시오

PHP가 제공하는 FTP_CONNECTFTP_LOGIN 기능을 사용하여 FTP 서버에 연결해야합니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</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-comment">// FTP 서버 주소</span></span><span>
</span><span><span class="hljs-variable">$ftp_user_name</span></span><span> = </span><span><span class="hljs-string">"username"</span></span><span>;     </span><span><span class="hljs-comment">// FTP 사용자 이름</span></span><span>
</span><span><span class="hljs-variable">$ftp_user_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-comment">// 연결하십시오 FTP 섬기는 사람</span></span><span>
</span><span><span class="hljs-variable">$conn_id</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>);

</span><span><span class="hljs-comment">// 로그인하십시오 FTP 섬기는 사람</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (@</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_name</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_pass</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"成功연결하십시오 <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法연결하십시오 <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

위의 코드는 FTP_Connect를 통해 FTP 서버에 연결되며 인증을 위해 FTP_LOGIN을 사용합니다.

3. FTP_RAWLIST를 사용하여 파일 및 디렉토리 목록을 가져옵니다

FTP_RAWLIST 함수는 서버에서 지정된 원래 디렉토리 목록을 반환합니다. 이 목록에는 권한, 크기, 날짜 등과 같은 각 파일 또는 디렉토리에 대한 세부 사항이 포함되어 있습니다.이 정보를 분석하여 파일이 이미 존재하는지 확인하고 업로드할지 여부를 결정할 수 있습니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 루트 디렉토리의 파일 목록을 가져옵니다</span></span><span>
</span><span><span class="hljs-variable">$remote_dir</span></span><span> = </span><span><span class="hljs-string">"/"</span></span><span>;
</span><span><span class="hljs-variable">$file_list</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_dir</span></span><span>);

</span><span><span class="hljs-comment">// 얻은 파일 목록을 출력합니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$file_list</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

위 코드를 실행하면 다음 형식과 유사한 파일 목록이 반환됩니다.

 <span><span>Array
(
    [0] =&gt; drwxr-xr-x   2 1000 1000  4096 May  7 12:30 public_html
    [1] =&gt; -rw-r--r--   1 1000 1000  2048 May  7 12:35 index.php
    [2] =&gt; -rw-r--r--   1 1000 1000  1024 May  7 12:36 style.css
)
</span></span>

이 정보를 분석하면 스크립트를 작성하여 파일이 이미 존재하는지 확인하거나 파일 수정 시간을 얻어 파일을 업로드 해야하는지 결정할 수 있습니다.

4. 로컬 및 원격 파일을 비교하십시오

로컬 배포 폴더가 있고 원격 서버의 파일과 비교하고 싶다고 가정합니다. FTP_RAWLIST를 사용하여 원격 파일의 타임 스탬프와 크기를 얻고 로컬 파일의 정보를 결합하여 업로드할지 여부를 결정할 수 있습니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 로컬 파일 경로</span></span><span>
</span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'path/to/local/index.php'</span></span><span>;
</span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'index.php'</span></span><span>;

</span><span><span class="hljs-comment">// 로컬 파일의 수정 시간을 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$local_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filemtime</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>);

</span><span><span class="hljs-comment">// 원격 파일에 대한 자세한 정보를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>);
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">explode</span></span><span>(</span><span><span class="hljs-string">" "</span></span><span>, </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
</span><span><span class="hljs-variable">$remote_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtotime</span></span><span>(</span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">5</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">6</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">7</span></span><span>]);

</span><span><span class="hljs-comment">// 파일 시간을 비교하십시오,업로드 여부를 결정하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file_time</span></span><span> &gt; </span><span><span class="hljs-variable">$remote_file_time</span></span><span>) {
    </span><span><span class="hljs-comment">// 파일 업로드</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>, FTP_BINARY)) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"문서 <span class="hljs-subst">$local_file</span></span></span><span> 성공적으로 업로드하십시오!\n";
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"문서 <span class="hljs-subst">$local_file</span></span></span><span> 업로드 실패!\n";
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"远程문서已经是最新的,업로드가 필요하지 않습니다。\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

5. 자동 배포 스크립트

이제 모든 부분을 결합하고 자동 배포 스크립트를 작성합니다. 이 스크립트는 원격 서버에 업데이트 및 업로드해야 할 파일을 자동으로 결정합니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</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_user_name</span></span><span> = </span><span><span class="hljs-string">"username"</span></span><span>;
</span><span><span class="hljs-variable">$ftp_user_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">$conn_id</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!@</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_name</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_pass</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法연결하십시오 <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}

</span><span><span class="hljs-comment">// 本地部署문서夹</span></span><span>
</span><span><span class="hljs-variable">$local_dir</span></span><span> = </span><span><span class="hljs-string">"path/to/local/files/"</span></span><span>;
</span><span><span class="hljs-variable">$remote_dir</span></span><span> = </span><span><span class="hljs-string">"/"</span></span><span>;

</span><span><span class="hljs-comment">// 获取本地문서列表</span></span><span>
</span><span><span class="hljs-variable">$local_files</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RecursiveIteratorIterator</span></span><span>(
    </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RecursiveDirectoryIterator</span></span><span>(</span><span><span class="hljs-variable">$local_dir</span></span><span>),
    </span><span><span class="hljs-title class_">RecursiveIteratorIterator</span></span><span>::</span><span><span class="hljs-variable constant_">LEAVES_ONLY</span></span><span>
);

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$local_files</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$local_file</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">isDir</span></span><span>()) {
        </span><span><span class="hljs-keyword">continue</span></span><span>;
    }

    </span><span><span class="hljs-comment">// 상대 경로를 얻으십시오</span></span><span>
    </span><span><span class="hljs-variable">$relative_path</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$local_dir</span></span><span>));

    </span><span><span class="hljs-comment">// 원격 파일에 대한 자세한 정보를 얻으십시오</span></span><span>
    </span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-variable">$remote_dir</span></span><span> . </span><span><span class="hljs-variable">$relative_path</span></span><span>;
    </span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>);
    
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$remote_file_info</span></span><span>) {
        </span><span><span class="hljs-comment">// 문서已存在,시간을 비교하십시오</span></span><span>
        </span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">explode</span></span><span>(</span><span><span class="hljs-string">" "</span></span><span>, </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
        </span><span><span class="hljs-variable">$remote_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtotime</span></span><span>(</span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">5</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">6</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">7</span></span><span>]);
        </span><span><span class="hljs-variable">$local_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filemtime</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>());

        </span><span><span class="hljs-comment">// 如果本地문서较新,업로드</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file_time</span></span><span> &gt; </span><span><span class="hljs-variable">$remote_file_time</span></span><span>) {
            </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), FTP_BINARY)) {
                </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"문서 <span class="hljs-subst">$relative_path</span></span></span><span> 성공적으로 업데이트하십시오!\n";
            } </span><span><span class="hljs-keyword">else</span></span><span> {
                </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"문서 <span class="hljs-subst">$relative_path</span></span></span><span> 업데이트가 실패했습니다!\n";
            }
        }
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-comment">// 문서不存在,직접 업로드하십시오</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), FTP_BINARY)) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"문서 <span class="hljs-subst">$relative_path</span></span></span><span> 성공적으로 업로드하십시오!\n";
        } </span><span><span class="hljs-keyword">else</span></span><span> {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"문서 <span class="hljs-subst">$relative_path</span></span></span><span> 업로드 실패!\n";
        }
    }
}

</span><span><span class="hljs-comment">// 폐쇄 FTP 연결하다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

6. 요약

FTP_Rawlist 기능을 통해 원격 서버에서 파일에 대한 자세한 정보를 쉽게 얻을 수 있습니다. 파일 수정 시간과 크기를 기반으로 새 파일을 업로드하거나 기존 파일을 덮어 쓰야하는지 여부를 결정할 수 있습니다. 이 방법은 자동 배포에 매우 적합하여 수동 작업을 효과적으로 줄이고 배포 효율성을 향상시킬 수 있습니다.

이 간단한 PHP 스크립트를 사용하면 FTP 업로드를 자동 배포와 결합하여보다 지능적인 파일 동기화 및 업데이트를 달성 할 수 있습니다.