먼저 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>
그런 다음 웹 서버를 다시 시작하십시오.
PHP가 제공하는 FTP_CONNECT 및 FTP_LOGIN 기능을 사용하여 FTP 서버에 연결해야합니다.
<span><span><span class="hljs-meta"><?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">?></span></span><span>
</span></span>
위의 코드는 FTP_Connect를 통해 FTP 서버에 연결되며 인증을 위해 FTP_LOGIN을 사용합니다.
FTP_RAWLIST 함수는 서버에서 지정된 원래 디렉토리 목록을 반환합니다. 이 목록에는 권한, 크기, 날짜 등과 같은 각 파일 또는 디렉토리에 대한 세부 사항이 포함되어 있습니다.이 정보를 분석하여 파일이 이미 존재하는지 확인하고 업로드할지 여부를 결정할 수 있습니다.
<span><span><span class="hljs-meta"><?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">?></span></span><span>
</span></span>
위 코드를 실행하면 다음 형식과 유사한 파일 목록이 반환됩니다.
<span><span>Array
(
[0] => drwxr-xr-x 2 1000 1000 4096 May 7 12:30 public_html
[1] => -rw-r--r-- 1 1000 1000 2048 May 7 12:35 index.php
[2] => -rw-r--r-- 1 1000 1000 1024 May 7 12:36 style.css
)
</span></span>
이 정보를 분석하면 스크립트를 작성하여 파일이 이미 존재하는지 확인하거나 파일 수정 시간을 얻어 파일을 업로드 해야하는지 결정할 수 있습니다.
로컬 배포 폴더가 있고 원격 서버의 파일과 비교하고 싶다고 가정합니다. FTP_RAWLIST를 사용하여 원격 파일의 타임 스탬프와 크기를 얻고 로컬 파일의 정보를 결합하여 업로드할지 여부를 결정할 수 있습니다.
<span><span><span class="hljs-meta"><?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> > </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">?></span></span><span>
</span></span>
이제 모든 부분을 결합하고 자동 배포 스크립트를 작성합니다. 이 스크립트는 원격 서버에 업데이트 및 업로드해야 할 파일을 자동으로 결정합니다.
<span><span><span class="hljs-meta"><?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>-></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>-></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>-></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> > </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>-></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>-></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">?></span></span><span>
</span></span>
FTP_Rawlist 기능을 통해 원격 서버에서 파일에 대한 자세한 정보를 쉽게 얻을 수 있습니다. 파일 수정 시간과 크기를 기반으로 새 파일을 업로드하거나 기존 파일을 덮어 쓰야하는지 여부를 결정할 수 있습니다. 이 방법은 자동 배포에 매우 적합하여 수동 작업을 효과적으로 줄이고 배포 효율성을 향상시킬 수 있습니다.
이 간단한 PHP 스크립트를 사용하면 FTP 업로드를 자동 배포와 결합하여보다 지능적인 파일 동기화 및 업데이트를 달성 할 수 있습니다.