PHP를 사용하여 FTP를 작동하는 과정에서, 우리는 종종 디렉토리와 원격 서버에서 모든 하위 디렉토리 및 파일을 얻어야하는 상황을 만나게됩니다. FTP_NLIST 및 FTP_RAWLIST 와 같은 방법이 PHP의 FTP 확장에 제공되지만 기본적으로 현재 디렉토리의 내용 만 나열합니다. 완전한 디렉토리 구조를 재귀 적으로 얻으려면 논리적 처리를 수동으로 구현해야합니다. 이 기사는 전체 예제를 사용하여 FTP_Rawlist를 사용하여 FTP에서 디렉토리 구조의 재귀 적 획득을 구현하는 방법을 자세히 분석합니다.
FTP_RAWLIST는 FTP 서버에서 지정된 디렉토리의 상세한 파일 목록을 얻는 PHP의 함수입니다. 반환 결과는 UNIX의 LS -L 명령의 형식 출력과 유사합니다. 예를 들어:
Array
(
[0] => drwxr-xr-x 2 ftp ftp 4096 Jan 01 12:00 folder
[1] => -rw-r--r-- 1 ftp ftp 1234 Jan 01 12:01 file.txt
)
파일 유형 (디렉토리 또는 파일), 이름, 크기, 수정 시간 및 기타 정보를이 정보에서 구문 분석 할 수 있습니다.
디렉토리 구조의 재귀 적 획득을 구현하려면 다음이 필요합니다.
FTP_RAWLIST를 사용하여 현재 디렉토리에서 모든 항목을 얻으십시오.
각 항목의 반환 내용을 분석하고 디렉토리인지 파일인지 확인하십시오.
디렉토리 인 경우 ( 및 ... ) 디렉토리 인 경우 디렉토리를 재귀 적으로 입력하십시오.
쉽게 후속 처리 또는 디스플레이를 위해 디렉토리 구조를 트리 어레이로 빌드하십시오.
다음은 구현 방법을 보여주는 사용 가능한 PHP 예입니다.
<?php
function getRecursiveFtpList($ftpConn, $path)
{
$structure = [];
$rawList = ftp_rawlist($ftpConn, $path);
if ($rawList === false) {
return $structure;
}
foreach ($rawList as $line) {
$parts = preg_split("/\s+/", $line, 9);
if (count($parts) < 9) continue;
$name = $parts[8];
$type = $parts[0][0];
$fullPath = $path . '/' . $name;
if ($type === 'd') {
if ($name === '.' || $name === '..') continue;
$structure[] = [
'type' => 'directory',
'name' => $name,
'path' => $fullPath,
'children' => getRecursiveFtpList($ftpConn, $fullPath),
];
} elseif ($type === '-') {
$structure[] = [
'type' => 'file',
'name' => $name,
'path' => $fullPath,
'size' => (int)$parts[4],
];
}
}
return $structure;
}
// 예제 사용:
$ftpHost = 'ftp.gitbox.net';
$ftpUser = 'your_username';
$ftpPass = 'your_password';
$conn = ftp_connect($ftpHost);
if (!$conn) {
die("연결할 수 없습니다 FTP 섬기는 사람");
}
if (!ftp_login($conn, $ftpUser, $ftpPass)) {
ftp_close($conn);
die("FTP 로그인이 실패했습니다");
}
// 선택 과목:수동 모드를 설정하십시오
ftp_pasv($conn, true);
$directoryTree = getRecursiveFtpList($conn, '/');
ftp_close($conn);
// 인쇄 구조(디버깅을 위해)
echo "<pre>";
print_r($directoryTree);
echo "</pre>";
위 코드를 실행하면 다음과 유사한 출력이 나타납니다.
Array
(
[0] => Array
(
[type] => directory
[name] => public_html
[path] => /public_html
[children] => Array
(
[0] => Array
(
[type] => file
[name] => index.php
[path] => /public_html/index.php
[size] => 1234
)
...
)
)
[1] => Array
(
[type] => file
[name] => readme.txt
[path] => /readme.txt
[size] => 456
)
)
코딩 문제 : 일부 FTP 서버에서 반환 한 디렉토리 또는 파일 이름에는 UTF-8 문자가 포함되지 않으며 트랜스 코딩해야합니다.
성능 문제 : 대형 디렉토리 구조에서 재귀 작업이 느려질 수 있으며 캐싱 또는 페이징 전략이 적절하게 사용됩니다.
권한 제한 : FTP 사용자가 재귀 디렉토리에 대한 권한을 읽는지 확인하십시오. 그렇지 않으면 모든 것이 나열되지 않을 수 있습니다.
수동 모드 : 일부 FTP 서비스는 수동 모드를 활성화하고 ftp_pasv ($ conn, true)를 사용해야합니다. 환경.
FTP_RAWLIST 및 재귀 처리를 통해 PHP의 FTP 서버에서 디렉토리 구조를 완전히 얻을 수 있습니다. 이 방법은 매우 유연하며 주문시 데이터 구조를 사용자 정의 할 수 있으며, 이는 자동 배포, 백업 동기화, 파일 브라우징 등과 같은 응용 프로그램 시나리오에 매우 유용합니다.
이 기사의 완전한 예가이 기술을 마스터하고 실제 개발에 적용하는 데 도움이되기를 바랍니다.