Dans le processus d'exploitation FTP à l'aide de PHP, nous rencontrons souvent des situations où nous devons obtenir un répertoire et tous ses sous-répertoires et fichiers sur le serveur distant. Bien que des méthodes telles que FTP_NList et FTP_Rawlist soient fournies dans l'extension FTP de PHP, elles répertorient uniquement le contenu du répertoire actuel par défaut. Si nous voulons obtenir de manière récursive la structure du répertoire complet, nous devons implémenter manuellement le traitement logique. Cet article utilisera un exemple complet pour analyser en détail comment utiliser FTP_RAWLIST pour implémenter l'acquisition récursive des structures de répertoires sur FTP.
FTP_RAWLIST est une fonction de PHP qui obtient une liste de fichiers détaillée des répertoires spécifiés sur le serveur FTP. Son résultat de retour est similaire à la sortie du format de la commande ls -l d'Unix. Par exemple:
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
)
Nous pouvons analyser le type de fichier (répertoire ou fichier), nom, taille, temps de modification et autres informations à partir de ces informations.
Pour mettre en œuvre une acquisition récursive de la structure du répertoire, nous avons besoin:
Utilisez ftp_rawlist pour obtenir toutes les entrées dans le répertoire actuel;
Analyser le contenu de retour de chaque élément et identifier s'il s'agit d'un répertoire ou d'un fichier;
S'il s'agit d'un répertoire (et non . Ou ... ), alors entrez récursivement dans le répertoire;
Construisez la structure du répertoire dans un tableau d'arborescence pour un traitement ou un affichage ultérieur facile.
Voici un exemple de PHP disponible qui montre comment l'implémenter:
<?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;
}
// Exemple d'utilisation:
$ftpHost = 'ftp.gitbox.net';
$ftpUser = 'your_username';
$ftpPass = 'your_password';
$conn = ftp_connect($ftpHost);
if (!$conn) {
die("Impossible de se connecter à FTP serveur");
}
if (!ftp_login($conn, $ftpUser, $ftpPass)) {
ftp_close($conn);
die("FTP La connexion a échoué");
}
// Facultatif:Définir le mode passif
ftp_pasv($conn, true);
$directoryTree = getRecursiveFtpList($conn, '/');
ftp_close($conn);
// Structure d'impression(Pour le débogage)
echo "<pre>";
print_r($directoryTree);
echo "</pre>";
Après avoir exécuté le code ci-dessus, vous obtiendrez une sortie similaire à:
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
)
)
Problèmes de codage : le répertoire ou le nom de fichier renvoyé par certains serveurs FTP peut contenir des caractères non UTF-8 et doit être transcodé;
Problèmes de performance : les opérations récursives peuvent être lentes dans les grandes structures de répertoires, et les stratégies de mise en cache ou de pagination sont utilisées de manière appropriée;
Restrictions d'autorisation : Assurez-vous que les utilisateurs de FTP ont des autorisations de lecture des répertoires récursifs, sinon tout peut ne pas être répertorié;
Mode passif : certains services FTP doivent activer le mode passif et utiliser FTP_PASV ($ Conn, True); paramètre.
Grâce à FTP_RAWLIST et au traitement récursif, nous pouvons obtenir entièrement la structure du répertoire sur le serveur FTP dans PHP. Cette méthode est très flexible et peut personnaliser les structures de données à la demande, ce qui est très utile pour les scénarios d'application tels que le déploiement automatisé, la synchronisation de sauvegarde, la navigation de fichiers, etc.
Espérons que les exemples complets de cet article vous aideront à maîtriser cette technique et à l'appliquer au développement réel.