PHP FTP
FTP en PHP permet de transférer des fichiers entre client et serveur via TCP. Découvrez connexion, authentification, upload, download et gestion de fichiers.
Introduction
FTP (File Transfer Protocol) est un protocole réseau standard permettant de transférer des fichiers entre un client et un serveur via une connexion TCP. PHP intègre une extension FTP (ext-ftp) qui permet à vos scripts de se connecter à un serveur distant et de déplacer des fichiers de manière programmée — utile pour déployer des ressources, synchroniser des sauvegardes ou récupérer des flux de données depuis le serveur d'un partenaire.
Ce chapitre couvre l'ensemble du processus : connexion, authentification, passage en mode passif, envoi et téléchargement de fichiers, listage et gestion des fichiers distants, et enfin fermeture propre de la connexion. Il explique également les précautions de sécurité à connaître avant d'utiliser le FTP simple en production.
Note de sécurité en premier. Le FTP simple envoie votre nom d'utilisateur, votre mot de passe et le contenu de vos fichiers sans chiffrement. Pour toute information sensible, utilisez
ftp_ssl_connect()(FTP over TLS) ou préférez SFTP (SSH File Transfer Protocol), que l'extension FTP ne supporte pas — utilisez l'extension PHP SSH2 ou une bibliothèque telle que phpseclib pour SFTP.
Le processus FTP typique
Chaque script FTP suit la même structure, quelle que soit l'opération effectuée :
- Connexion au serveur —
ftp_connect()(ouftp_ssl_connect()pour FTPS). - Authentification —
ftp_login(). - Configuration — généralement
ftp_pasv($conn, true)pour activer le mode passif. - Transfert / gestion de fichiers —
ftp_put(),ftp_get(),ftp_nlist(), etc. - Fermeture —
ftp_close().
Connexion à un serveur FTP
Établissez une connexion avec ftp_connect(). Cette fonction prend le nom d'hôte (et optionnellement le port et le délai d'attente) et retourne un objet FTP\Connection en cas de succès (une ressource avant PHP 8.1), ou false en cas d'échec.
<?php
$conn = ftp_connect("ftp.example.com", 21, 10); // host, port, timeout (seconds)
if ($conn === false) {
die("Could not connect to FTP server");
}
echo "Connected.";Notez que la connexion ne vous authentifie pas — à ce stade, vous disposez d'un canal anonyme non authentifié. Vous devez encore appeler ftp_login() avant que le serveur vous autorise à faire quoi que ce soit d'utile.
Utiliser FTPS (FTP over TLS)
Pour chiffrer les canaux de contrôle et de données, remplacez ftp_connect() par ftp_ssl_connect(). Le reste de l'API est identique :
<?php
$conn = ftp_ssl_connect("ftp.example.com");
if ($conn === false) {
die("Could not open a secure FTP connection");
}Authentification et mode passif
Après la connexion, authentifiez-vous avec ftp_login(). Pour les serveurs publics autorisant l'accès anonyme, utilisez le nom d'utilisateur anonymous avec un mot de passe ressemblant à une adresse e-mail.
<?php
$conn = ftp_connect("ftp.example.com");
if (!ftp_login($conn, "username", "password")) {
ftp_close($conn);
die("Login failed");
}
// Most networks behind a firewall/NAT require passive mode.
ftp_pasv($conn, true);
echo "Logged in.";Pourquoi le mode passif est important. En mode actif, le serveur ouvre une connexion de données vers votre client, ce que les pare-feu et les routeurs NAT bloquent presque toujours. En mode passif, c'est le client qui ouvre la connexion de données vers le serveur, ce qui fonctionne derrière les pare-feu. En règle générale, appelez ftp_pasv($conn, true) juste après la connexion. Il doit être défini après ftp_login(), pas avant.
Envoi de fichiers
Utilisez ftp_put() pour envoyer un fichier local vers le serveur. Sa signature est ftp_put($conn, $remote_file, $local_file, $mode), où $mode est FTP_BINARY ou FTP_ASCII.
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);
if (ftp_put($conn, "/public_html/report.pdf", "report.pdf", FTP_BINARY)) {
echo "Upload successful";
} else {
echo "Upload failed";
}
ftp_close($conn);FTP_BINARY vs FTP_ASCII. Utilisez FTP_BINARY pour tout ce qui n'est pas du texte brut — images, PDF, archives, exécutables — car le mode ASCII réécrit les fins de ligne et corrompra les données binaires. Utilisez FTP_ASCII uniquement lorsque vous souhaitez spécifiquement que les fins de ligne soient traduites entre plateformes pour les fichiers texte. En cas de doute, choisissez FTP_BINARY ; c'est la valeur par défaut sûre.
Pour les gros fichiers, vous pouvez envoyer de manière non bloquante avec ftp_nb_put(), ce qui permet à votre script d'effectuer d'autres tâches entre les fragments.
Téléchargement de fichiers
ftp_get() récupère un fichier distant vers le système de fichiers local. L'ordre des arguments est ftp_get($conn, $local_file, $remote_file, $mode) — notez que la destination locale vient en premier, à l'opposé de ftp_put(). Confondre ces deux ordres est l'erreur FTP la plus fréquente.
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);
// local_file first, then remote_file
if (ftp_get($conn, "backup.zip", "/backups/backup.zip", FTP_BINARY)) {
echo "Download successful";
} else {
echo "Download failed";
}
ftp_close($conn);Listage et gestion des fichiers distants
L'extension FTP fait bien plus que transférer des fichiers. Les fonctions de gestion courantes comprennent :
| Fonction | Rôle |
|---|---|
ftp_nlist($conn, $dir) | Tableau des noms de fichiers dans un répertoire |
ftp_rawlist($conn, $dir) | Listing détaillé de style ls -l |
ftp_size($conn, $file) | Taille du fichier en octets (-1 en cas d'erreur) |
ftp_mkdir($conn, $dir) | Créer un répertoire |
ftp_rmdir($conn, $dir) | Supprimer un répertoire (vide) |
ftp_delete($conn, $file) | Supprimer un fichier |
ftp_rename($conn, $from, $to) | Renommer / déplacer un fichier |
ftp_chdir($conn, $dir) | Changer le répertoire de travail |
ftp_pwd($conn) | Répertoire de travail courant |
ftp_chmod($conn, 0644, $file) | Modifier les permissions du fichier |
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);
$files = ftp_nlist($conn, "/public_html");
foreach ($files as $file) {
echo $file, " — ", ftp_size($conn, $file), " bytes\n";
}
ftp_close($conn);Fermeture de la connexion
Libérez toujours la connexion avec ftp_close() lorsque vous avez terminé. Encapsuler le processus dans un try/finally garantit que le socket est fermé même si une erreur est levée en cours de route :
<?php
$conn = ftp_connect("ftp.example.com");
if (!$conn || !ftp_login($conn, "username", "password")) {
die("Connection or login failed");
}
try {
ftp_pasv($conn, true);
ftp_put($conn, "/public_html/index.html", "index.html", FTP_BINARY);
} finally {
ftp_close($conn);
}Bonnes pratiques et pièges courants
- Préférez FTPS ou SFTP. N'envoyez jamais de credentials via FTP simple sur l'internet public.
- Activez toujours le mode passif (
ftp_pasv) sauf si vous avez une raison spécifique de ne pas le faire. - Choisissez le bon mode de transfert —
FTP_BINARYpour les données binaires,FTP_ASCIIuniquement pour le texte où la traduction des fins de ligne est souhaitée. - Surveillez l'ordre des arguments —
ftp_putest(remote, local),ftp_getest(local, remote). - Fermez toujours la connexion avec
ftp_close(). - Vérifiez chaque valeur de retour. Les fonctions FTP retournent
falseen cas d'échec plutôt que de lever une exception, les échecs silencieux sont donc faciles à manquer. ext-ftpdoit être activée. Vérifiez avecextension_loaded('ftp'); si cela retournefalse, activez l'extension dans votrephp.ini.
Sujets connexes
- Gestion de fichiers PHP — lecture et écriture de fichiers locaux.
- Upload de fichiers PHP — gestion des uploads via formulaires HTTP.
- Système de fichiers PHP — l'ensemble des fonctions du système de fichiers.
- Exceptions PHP — gestion structurée des erreurs avec
try/finally.