현재 위치: > 최신 기사 목록> FTP_Rawlist를 통해 FTP 디렉토리 스냅 샷 비교 기능을 구현하십시오

FTP_Rawlist를 통해 FTP 디렉토리 스냅 샷 비교 기능을 구현하십시오

gitbox 2025-05-26

매일 운영 및 유지 관리 또는 웹 사이트 관리에서 우리는 종종 필요를 나타냅니다. FTP 서버의 디렉토리 파일이 추가, 수정 또는 삭제되었는지 여부를 모니터링합니다. 파일 동기화 도구 또는 고급 모니터링 시스템을 사용하여 구현할 수 있지만, 더 가볍고 유연한 방식으로 디렉토리 스냅 샷 비교를 구현하려면 PHP가 제공하는 FTP_Rawlist 기능은 매우 실용적인 솔루션입니다.

1. ftp_rawlist 란 무엇입니까?

FTP_RAWLIST 는 PHP가 제공하는 FTP 작업 기능 중 하나이며 원격 디렉토리의 원본 디렉토리 목록을 얻을 수 있습니다. 파일 이름 만 반환하는 FTP_NLIST 와 비교하여 FTP_RAWLIST는 권한, 파일 크기, 타임 스탬프 등을 포함하여 UNIX LS -L 명령의 출력과 유사한 세부 정보를 반환합니다.

두 시점에서 캡처 된 FTP_Rawlist 결과를 비교함으로써 "디렉토리 스냅 샷"비교를 쉽게 달성하고 변경된 파일을 식별 할 수 있습니다.

2. 구현 로직에 대한 간단한 설명

  1. FTP 서버에 연결하고 로그인하십시오

  2. 대상 디렉토리의 파일 목록 크롤링 (예 : 스냅 샷)

  3. 스냅 샷을 로컬 파일에 저장하십시오

  4. 다음 달리기를 다시하고 마지막 스냅 샷과 비교하십시오.

  5. 출력 변경 (추가, 삭제, 수정)

3. PHP 구현 예

다음은 FTP 스냅 샷을 잡고 마지막 스냅 샷과 비교하는 방법을 보여주는 완전한 PHP 스크립트 예입니다.

<code>```php <? php

// FTP 구성
$ ftp_host = "ftp.gitbox.net";
$ ftp_user = "ftp_user";
$ ftp_pass = "ftp_password";
$ ftp_dir = "/htdocs/";
$ snapshot_file = dir . '/last_snapshot.txt';

// 연결하고 로그인합니다
$ conn = ftp_connect ($ ftp_host);
if (! $ conn) {
다이 ( "FTP 서버에 연결할 수 없음");
}
if (! ftp_login ($ conn, $ ftp_user, $ ftp_pass)) {
ftp_close ($ conn);
다이 ( "FTP 로그인 실패");
}

// 현재 스냅 샷을 가져옵니다
ftp_chdir ($ conn, $ ftp_dir);
$ rawlist = ftp_rawlist ($ conn, ".");
ftp_close ($ conn);

// 스냅 샷을 구조화 된 배열로 구분합니다
함수 parse_rawlist ($ rawlist) {
$ snapshot = [];
foreach ($ rawlist as $ line) {
$ parts = preg_split ( "/\ s+/", $ line, 9);
if (count ($ parts) <9) 계속;
$ name = $ parts [8];
$ info = [
'perm'=> $ 부품 [0],
'size'=> $ parts [4],
'날짜'=> "{$ parts [5]} {$ parts [6]} {$ parts [7]}"
];
$ snapshot [$ name] = $ info;
}
반환 $ 스냅 샷;
}

$ current_snapshot = parse_rawlist ($ rawlist);

// 마지막 스냅 샷을로드합니다
$ prevery_snapshot = file_exists ($ snapshot_file)? unsserialize (file_get_contents ($ snapshot_file)) : [];

// 비교 스냅 샷
$ adds = array_diff_key ($ current_snapshot, $ prevery_snapshot);
$ deleted = array_diff_key ($ prevery_snapshot, $ current_snapshot);
$ modified = [];

foreach ($ current_snapshot as $ file => $ info) {
if (isset ($ prevery_snapShot [$ file])) {
if ($ info [ 'size']! == $ prevery_snapShot [$ file] [ 'size'] ||
$ info [ 'date']! == $ prevery_snapShot [$ file] [ 'date']) {
$ modified [$ file] = $ info;
}
}
}

// 출력 변경 결과
echo "=== 파일 변경 보고서 === \ n";

if ($ 추가) {
echo "\ n [새 파일] : \ n";
foreach ($ as $ file => $ info) {
echo " + $ file \ n";
}
}

if ($ deleted) {
echo "\ n [파일 삭제] : \ n";
foreach ($ deleted as $ file => $ info) {
echo " - $ file \ n";
}
}

if ($ modified) {
echo "\ n [파일 수정] : \ n";
foreach ($ modified as $ file => $ info) {
echo " * $ file \ n";
}
}

// 현재 스냅 샷을 저장합니다
file_put_contents ($ snapshot_file, serialize ($ current_snapshot));

 </code>

## 네、실용적인 제안

1. **시간이 정한 실행**:사용 가능 `cron` 또는 Windows 미션 계획 시간당/하루에 한 번 스크립트를 실행하십시오,정기적으로 스냅 샷을 생성합니다。
2. **알림 메커니즘**:可以将变动信息통과하다邮件또는Webhook알림을 보냅니다,적시에 위험 운영에 대한 정보를 얻으십시오。
3. **필터링 규칙**:脚本中可加入白名单또는忽略规则,예를 들어, 건너 뛰기 `.log`、`.tmp` 문서。

## 다섯、요약

통과하다 `ftp_rawlist` 원래 디렉토리 구조를 얻으십시오,구조、직렬화 및 비교,우리는 매우 적은 비용으로 비슷한 비용을 달성 할 수 있습니다.“디렉토리 모니터링”기능。이 방법은 특히 소규모 프로젝트에 적합합니다、오래된 시스템、또는仅需临时监控的场景。자원을 저장합니다,유연하고 효율적입니다,예PHP경량 자동화에 실질적인 사용“흑인 기술”。