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サーバーのディレクトリ構造を完全に取得できます。この方法は非常に柔軟性があり、オンデマンドでデータ構造をカスタマイズできます。これは、自動展開、バックアップ同期、ファイルブラウジングなどのアプリケーションシナリオに非常に役立ちます。
この記事の完全な例が、このテクニックを習得し、実際の開発に適用するのに役立つことを願っています。