Tout d'abord, vous devez vous assurer que votre environnement PHP prend en charge les fonctions FTP. Vous pouvez vérifier s'il est activé par:
<span><span><span class="hljs-title function_ invoke__">phpinfo</span></span><span>();
</span></span>
Trouvez la section FTP dans la sortie pour vous assurer que l'extension FTP est activée. Si elle n'est pas activée, l'extension peut être activée en modifiant le fichier php.ini :
<span><span><span class="hljs-attr">extension</span></span><span>=ftp
</span></span>
Redémarrez ensuite votre serveur Web.
Nous devons nous connecter au serveur FTP à l'aide des fonctions FTP_Connect et FTP_Login fournies par PHP.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$ftp_server</span></span><span> = </span><span><span class="hljs-string">"ftp.example.com"</span></span><span>; </span><span><span class="hljs-comment">// FTP Adresse du serveur</span></span><span>
</span><span><span class="hljs-variable">$ftp_user_name</span></span><span> = </span><span><span class="hljs-string">"username"</span></span><span>; </span><span><span class="hljs-comment">// FTP nom d'utilisateur</span></span><span>
</span><span><span class="hljs-variable">$ftp_user_pass</span></span><span> = </span><span><span class="hljs-string">"password"</span></span><span>; </span><span><span class="hljs-comment">// FTP mot de passe</span></span><span>
</span><span><span class="hljs-comment">// Se connecter à FTP serveur</span></span><span>
</span><span><span class="hljs-variable">$conn_id</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>);
</span><span><span class="hljs-comment">// Se connecter FTP serveur</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (@</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_name</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_pass</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"成功Se connecter à <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法Se connecter à <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Le code ci-dessus se connecte au serveur FTP via FTP_Connect et utilise FTP_Login pour l'authentification.
La fonction ftp_rawlist renvoie la liste originale des répertoires spécifiés par le serveur. Cette liste comprend des détails pour chaque fichier ou répertoire, tels que les autorisations, la taille, la date, etc.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Obtenez la liste des fichiers du répertoire racine</span></span><span>
</span><span><span class="hljs-variable">$remote_dir</span></span><span> = </span><span><span class="hljs-string">"/"</span></span><span>;
</span><span><span class="hljs-variable">$file_list</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_dir</span></span><span>);
</span><span><span class="hljs-comment">// Sortir la liste des fichiers obtenus</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$file_list</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Après avoir exécuté le code ci-dessus, une liste de fichiers similaires au format suivant sera renvoyé:
<span><span>Array
(
[0] => drwxr-xr-x 2 1000 1000 4096 May 7 12:30 public_html
[1] => -rw-r--r-- 1 1000 1000 2048 May 7 12:35 index.php
[2] => -rw-r--r-- 1 1000 1000 1024 May 7 12:36 style.css
)
</span></span>
En analysant ces informations, nous pouvons écrire des scripts pour vérifier s'il existe déjà un fichier, ou obtenir le temps de modification du fichier, déterminant ainsi si le fichier doit être téléchargé.
Supposons que nous ayons un dossier de déploiement local et que nous souhaitions le comparer aux fichiers sur le serveur distant. Nous pouvons utiliser ftp_rawlist pour obtenir l'horodatage et la taille du fichier distant, et combiner les informations du fichier local pour décider de télécharger.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Chemin de fichier local</span></span><span>
</span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'path/to/local/index.php'</span></span><span>;
</span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'index.php'</span></span><span>;
</span><span><span class="hljs-comment">// Obtenez le temps de modification des fichiers locaux</span></span><span>
</span><span><span class="hljs-variable">$local_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filemtime</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>);
</span><span><span class="hljs-comment">// Obtenez des informations détaillées sur les fichiers distants</span></span><span>
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>);
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">explode</span></span><span>(</span><span><span class="hljs-string">" "</span></span><span>, </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
</span><span><span class="hljs-variable">$remote_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtotime</span></span><span>(</span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">5</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">6</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">7</span></span><span>]);
</span><span><span class="hljs-comment">// Comparez l'heure du fichier,Décider de télécharger</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file_time</span></span><span> > </span><span><span class="hljs-variable">$remote_file_time</span></span><span>) {
</span><span><span class="hljs-comment">// Télécharger le fichier</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>, FTP_BINARY)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"document <span class="hljs-subst">$local_file</span></span></span><span> Télécharger avec succès!\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"document <span class="hljs-subst">$local_file</span></span></span><span> Le téléchargement a échoué!\n";
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"远程document已经是最新的,Aucun téléchargement requis。\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Maintenant, nous combinons toutes les pièces et écrivons un script de déploiement automatisé. Ce script déterminera automatiquement quels fichiers doivent être mis à jour et téléchargés sur le serveur distant.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$ftp_server</span></span><span> = </span><span><span class="hljs-string">"ftp.example.com"</span></span><span>;
</span><span><span class="hljs-variable">$ftp_user_name</span></span><span> = </span><span><span class="hljs-string">"username"</span></span><span>;
</span><span><span class="hljs-variable">$ftp_user_pass</span></span><span> = </span><span><span class="hljs-string">"password"</span></span><span>;
</span><span><span class="hljs-comment">// Se connecter à FTP serveur</span></span><span>
</span><span><span class="hljs-variable">$conn_id</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!@</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_name</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_pass</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法Se connecter à <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 本地部署document夹</span></span><span>
</span><span><span class="hljs-variable">$local_dir</span></span><span> = </span><span><span class="hljs-string">"path/to/local/files/"</span></span><span>;
</span><span><span class="hljs-variable">$remote_dir</span></span><span> = </span><span><span class="hljs-string">"/"</span></span><span>;
</span><span><span class="hljs-comment">// 获取本地document列表</span></span><span>
</span><span><span class="hljs-variable">$local_files</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RecursiveIteratorIterator</span></span><span>(
</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RecursiveDirectoryIterator</span></span><span>(</span><span><span class="hljs-variable">$local_dir</span></span><span>),
</span><span><span class="hljs-title class_">RecursiveIteratorIterator</span></span><span>::</span><span><span class="hljs-variable constant_">LEAVES_ONLY</span></span><span>
);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$local_files</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$local_file</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file</span></span><span>-></span><span><span class="hljs-title function_ invoke__">isDir</span></span><span>()) {
</span><span><span class="hljs-keyword">continue</span></span><span>;
}
</span><span><span class="hljs-comment">// Obtenez le chemin relatif</span></span><span>
</span><span><span class="hljs-variable">$relative_path</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$local_dir</span></span><span>));
</span><span><span class="hljs-comment">// Obtenez des informations détaillées sur les fichiers distants</span></span><span>
</span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-variable">$remote_dir</span></span><span> . </span><span><span class="hljs-variable">$relative_path</span></span><span>;
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$remote_file_info</span></span><span>) {
</span><span><span class="hljs-comment">// document已存在,Comparez le temps</span></span><span>
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">explode</span></span><span>(</span><span><span class="hljs-string">" "</span></span><span>, </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
</span><span><span class="hljs-variable">$remote_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtotime</span></span><span>(</span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">5</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">6</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">7</span></span><span>]);
</span><span><span class="hljs-variable">$local_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filemtime</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>());
</span><span><span class="hljs-comment">// 如果本地document较新,Télécharger</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file_time</span></span><span> > </span><span><span class="hljs-variable">$remote_file_time</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), FTP_BINARY)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"document <span class="hljs-subst">$relative_path</span></span></span><span> Mettre à jour avec succès!\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"document <span class="hljs-subst">$relative_path</span></span></span><span> La mise à jour a échoué!\n";
}
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// document不存在,Télécharger directement</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), FTP_BINARY)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"document <span class="hljs-subst">$relative_path</span></span></span><span> Télécharger avec succès!\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"document <span class="hljs-subst">$relative_path</span></span></span><span> Le téléchargement a échoué!\n";
}
}
}
</span><span><span class="hljs-comment">// fermeture FTP connecter</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Grâce à la fonction ftp_rawlist , nous pouvons facilement obtenir des informations détaillées des fichiers sur le serveur distant. En fonction du temps et de la taille de modification du fichier, nous pouvons déterminer si nous devons télécharger un nouveau fichier ou écraser le fichier existant. Cette méthode est très adaptée au déploiement automatisé, qui peut réduire efficacement les opérations manuelles et améliorer l'efficacité du déploiement.
Avec ce script PHP simple, vous pouvez combiner des téléchargements FTP avec un déploiement automatisé pour réaliser une synchronisation et des mises à jour de fichiers plus intelligents.