現在の位置: ホーム> 最新記事一覧> CLIスクリプトでFTP_RAWLISTを適用するためのヒント

CLIスクリプトでFTP_RAWLISTを適用するためのヒント

gitbox 2025-05-26

PHP開発では、特にファイル管理またはリモートサーバーインタラクションを自動化するタスクに関しては、 FTP_RAWLIST()は非常に有用な機能です。これにより、開発者はFTPプロトコルを介してディレクトリの元のリスト情報を取得できます。これは、FTPサーバー上のファイルの細かい処理に非常に重要です。この記事では、FTP_RAWLIST()関数を使用する詳細なスキルを検討し、実用的なケースを組み合わせてコマンドラインスクリプトにアプリケーションを表示します。

1。関数の紹介

FTP_RAWLIST()は、PHP FTP拡張機能によって提供される関数の1つであり、プロトタイプは次のとおりです。

 array ftp_rawlist ( FTP\Connection $ftp_stream , string $directory [, bool $recursive = false ] )

この関数は、指定されたディレクトリ内のすべてのファイルとサブディレクトリの詳細情報を返し、通常、形式はLS -Lコマンドと同じです。これは、返された文字列からアクセス許可、ファイルサイズ、変更時間、ファイル名、およびその他の情報を抽出できることを意味します。

2。コマンドラインスクリプトでの使用に適した理由

CLI(コマンドラインインターフェイス)スクリプトでは、 FTP_RAWLIST()の役割は特に明白であり、主な理由は次のとおりです。

  1. GUIインタラクションなしでリモートディレクトリ構造を自動的に処理します

  2. CRONタイミングを介してFTPディレクトリをチェックするなどの定期的なタスクに適しています

  3. カスタム論理解析ディレクトリ構造をサポートします

3.実用的なケース1:特定のディレクトリにファイルをリストし、過去7日以内に変更されたファイルをフィルタリングします

<?php

$ftp = ftp_connect('ftp.gitbox.net');
ftp_login($ftp, 'username', 'password');

$rawList = ftp_rawlist($ftp, '/public_html/files');

$recentFiles = [];
$now = time();

foreach ($rawList as $line) {
    $parts = preg_split("/\s+/", $line, 9);
    if (count($parts) < 9 || $parts[0][0] === 'd') {
        continue; // ディレクトリを無視します
    }

    $month = $parts[5];
    $day = $parts[6];
    $timeOrYear = $parts[7];
    $filename = $parts[8];

    $filetime = strtotime("$month $day $timeOrYear");
    if ($filetime !== false && ($now - $filetime) <= 7 * 24 * 60 * 60) {
        $recentFiles[] = $filename;
    }
}

print_r($recentFiles);

ftp_close($ftp);

このスクリプトは、 ftp.gitbox.netのFTPサーバーに接続し、 /public_html /filesディレクトリのすべてのファイルを取得し、過去7日間に変更されたファイル名をフィルタリングします。

4.実用的なケース2:すべてのファイルを再帰的にリストし、ローカルエリアにダウンロードします

再帰サポートはFTP_RAWLIST()の組み込み機能ではありませんが、再帰機能を通じて自分で実装できます。

 <?php

function listAllFiles($ftp, $dir = '.', $base = '') {
    $files = [];

    $list = ftp_rawlist($ftp, $dir);

    foreach ($list as $item) {
        $info = preg_split("/\s+/", $item, 9);
        $name = $info[8];
        $fullPath = "$dir/$name";

        if ($info[0][0] === 'd') {
            $files = array_merge($files, listAllFiles($ftp, $fullPath, "$base$name/"));
        } else {
            $files[] = "$base$name";
        }
    }

    return $files;
}

$ftp = ftp_connect('ftp.gitbox.net');
ftp_login($ftp, 'username', 'password');

$allFiles = listAllFiles($ftp, '/public_html/downloads/');

foreach ($allFiles as $file) {
    $local = __DIR__ . '/downloads/' . $file;
    if (!is_dir(dirname($local))) {
        mkdir(dirname($local), 0777, true);
    }
    ftp_get($ftp, $local, '/public_html/downloads/' . $file, FTP_BINARY);
    echo "Downloaded: $file\n";
}

ftp_close($ftp);

このスクリプトは、すべてのファイルパスを再帰的に取得し、 /public_html/downloads/ directoryのftp.gitbox.netからローカルディレクトリにダウンロードして、元のディレクトリ構造を維持できます。

5。デバッグとコーディングのための予防策

  1. 解析形式は固定されていません。異なるFTPサーバーによって返されるリスト形式はわずかに異なる場合があり、解析するときは柔軟な通常のロジックまたは分割ロジックを使用する必要があります。

  2. 接続とタイムアウト:合理的なタイムアウトを設定してロジックを再試行して、スクリプトが立ち往生しないようにすることをお勧めします。

  3. 許可チェック:FTPアカウントがディレクトリとファイルを読む許可を持っていることを確認してください。

6。概要

FTP_RAWLIST()関数は、適切な解析と論理的な組み合わせにより、元の文字列を出力しますが、FTPディレクトリの監視、バックアップ、および自動管理のための強力なコマンドラインツールを構築することができます。毎日の操作とメンテナンススクリプトであろうと、マスタリングする価値のある強力なツールです。