Während des Betriebs von FTP mit PHP begegnen wir häufig Situationen, in denen wir ein Verzeichnis und alle seine Unterverzeichnisse und Dateien auf dem Remote -Server erhalten müssen. Obwohl Methoden wie FTP_NLIST und FTP_RAWLIST in der FTP -Erweiterung von PHP bereitgestellt werden, listen sie nur den Inhalt des aktuellen Verzeichnisses standardmäßig auf. Wenn wir die vollständige Verzeichnisstruktur rekursiv erhalten möchten, müssen wir die logische Verarbeitung manuell implementieren. In diesem Artikel wird ein vollständiges Beispiel verwendet, um ausführlich zu analysieren, wie FTP_RAWLIST verwendet wird, um die rekursive Erfassung von Verzeichnisstrukturen auf FTP zu implementieren.
FTP_RAWLIST ist eine Funktion in PHP, die eine detaillierte Dateiliste der angegebenen Verzeichnisse auf dem FTP -Server erhält. Das Rückgabeergebnis ähnelt dem Formatausgang des UNIX -Befehls von LS -L . Zum Beispiel:
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
)
Wir können den Dateityp (Verzeichnis oder Datei), den Namen, die Größe, die Änderungszeit und andere Informationen aus diesen Informationen analysieren.
Um einen rekursiven Erwerb von Verzeichnisstruktur zu implementieren, brauchen wir:
Verwenden Sie FTP_RAWLIST , um alle Einträge im aktuellen Verzeichnis zu erhalten.
Analysieren Sie den Rückgabeinhalt jedes Elements und ermitteln Sie, ob es sich um ein Verzeichnis oder eine Datei handelt.
Wenn es sich um ein Verzeichnis handelt (und nicht . Oder ... ), geben Sie rekursiv das Verzeichnis ein.
Erstellen Sie die Verzeichnisstruktur in ein Baumarray, um eine einfache nachfolgende Verarbeitung oder Anzeige zu erhalten.
Hier ist ein verfügbares PHP -Beispiel, das zeigt, wie es implementiert werden soll:
<?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;
}
// Beispiel Verwendung:
$ftpHost = 'ftp.gitbox.net';
$ftpUser = 'your_username';
$ftpPass = 'your_password';
$conn = ftp_connect($ftpHost);
if (!$conn) {
die("Es kann keine Verbindung zu herstellen können FTP Server");
}
if (!ftp_login($conn, $ftpUser, $ftpPass)) {
ftp_close($conn);
die("FTP Fehler bei der Anmeldung");
}
// Optional:Setzen Sie den passiven Modus
ftp_pasv($conn, true);
$directoryTree = getRecursiveFtpList($conn, '/');
ftp_close($conn);
// Druckstruktur(Zum Debuggen)
echo "<pre>";
print_r($directoryTree);
echo "</pre>";
Nach dem Ausführen des oben genannten Code erhalten Sie eine ähnliche Ausgabe wie:
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
)
)
Codierungsprobleme : Der von einigen FTP-Servern zurückgegebene Verzeichnis oder Dateiname kann nicht-UTF-8-Zeichen enthalten und müssen transkodiert werden.
Leistungsprobleme : Rekursive Operationen können unter großen Verzeichnisstrukturen langsam sein, und Strategien für Caching oder Paging werden angemessen angewendet.
Berechtigungsbeschränkungen : Stellen Sie sicher, dass die FTP -Benutzer Berechtigungen für rekursive Verzeichnisse gelesen haben, da sonst nicht alles aufgeführt ist.
Passiver Modus : Einige FTP -Dienste müssen den passiven Modus aktivieren und FTP_PASV ($ conn, true) verwenden. Einstellung.
Durch FTP_RAWLIST und rekursive Verarbeitung können wir die Verzeichnisstruktur auf dem FTP -Server in PHP vollständig abrufen. Diese Methode ist sehr flexibel und kann Datenstrukturen bei Bedarf anpassen, was für Anwendungsszenarien wie automatisierte Bereitstellung, Sicherungssynchronisation, Dateistöbern usw. nützlich ist.
Hoffentlich helfen Ihnen die vollständigen Beispiele dieses Artikels, diese Technik zu meistern und auf die tatsächliche Entwicklung anzuwenden.