Dans PHP, le processus d'utilisation de la fonction fsocckopen () pour implémenter le téléchargement de fichiers FTP est relativement de faible niveau, impliquant des opérations manuelles sur le protocole FTP. Bien que PHP fournit une série de fonctions FTP_ * pour simplifier le processus de téléchargement FTP, vous pouvez parfois rencontrer des besoins spéciaux, ou afin de contrôler le processus de téléchargement de manière plus granulaire, choisissez de l'implémenter directement via fsocckopen () . Cet article introduira en détail comment implémenter le téléchargement de fichiers FTP via fsocckopen () et souligner certains points clés qui nécessitent une attention particulière.
FTP (Protocole de transfert de fichiers) est un protocole réseau couramment utilisé utilisé pour transférer des fichiers entre les clients et les serveurs. À l'aide de la fonction fsocckopen () , vous pouvez ouvrir une connexion à socket au serveur FTP dans PHP, afin d'interagir avec le serveur FTP et effectuer un téléchargement, un téléchargement et d'autres opérations.
Établir une connexion <br> Tout d'abord, nous devons utiliser fsocckopen () pour ouvrir la connexion au serveur FTP. En règle générale, le port par défaut du serveur FTP est de 21.
<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_port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>;
</span><span><span class="hljs-variable">$ftp_user</span></span><span> = </span><span><span class="hljs-string">'username'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_pass</span></span><span> = </span><span><span class="hljs-string">'password'</span></span><span>;
</span><span><span class="hljs-comment">// CréerFTPConnexion du serveur</span></span><span>
</span><span><span class="hljs-variable">$ftp_socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>, </span><span><span class="hljs-variable">$ftp_port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$ftp_socket</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"FTPÉchec de la connexion: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)");
}
</span></span>
Recevoir une réponse du serveur
FTP envoie généralement un message de bienvenue lorsque la connexion est établie. Nous devons lire et vérifier la réponse du serveur pour assurer une connexion réussie.
<span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'220'</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Échec de la connexion: <span class="hljs-subst">$response</span></span></span><span>");
}
</span></span>
Envoyer le nom d'utilisateur et le mot de passe <br> Dans le protocole FTP, le processus de connexion se fait en envoyant des commandes de nom d'utilisateur (utilisateur) et de mot de passe (PASS). Nous pouvons utiliser la fonction fput () pour envoyer ces commandes.
<span><span><span class="hljs-comment">// Envoyer le nom d'utilisateur</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"USER <span class="hljs-subst">$ftp_user</span></span></span><span>\r\n");
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'331'</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Erreur dans le nom d'utilisateur: <span class="hljs-subst">$response</span></span></span><span>");
}
</span><span><span class="hljs-comment">// Envoyer un mot de passe</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"PASS <span class="hljs-subst">$ftp_pass</span></span></span><span>\r\n");
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'230'</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Mot de passe d'erreur: <span class="hljs-subst">$response</span></span></span><span>");
}
</span></span>
Définir le mode passif (facultatif)
Dans certains environnements réseau, l'utilisation du mode passif (PASV) est plus stable. Le mode passif ouvrira un nouveau port du côté serveur FTP, et le client se connecte à ce port pour la transmission de données.
<span><span><span class="hljs-comment">// Entrez le mode passif</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"PASV\r\n"</span></span><span>);
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'227'</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Entrez le mode passif失败: <span class="hljs-subst">$response</span></span></span><span>");
}
</span></span>
La réponse renvoyée par le serveur contiendra des informations sur un port de données, et vous devez analyser cette réponse pour obtenir le port de données.
Télécharger le fichier <br> Pour télécharger un fichier, vous devez envoyer une commande storal pour spécifier l'emplacement de téléchargement du fichier, puis transférer le contenu du fichier vers le bloc serveur par bloc.
<span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'local_file.txt'</span></span><span>;
</span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'remote_file.txt'</span></span><span>;
</span><span><span class="hljs-comment">// Ouvrir le fichier local</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法Ouvrir le fichier local: <span class="hljs-subst">$local_file</span></span></span><span>");
}
</span><span><span class="hljs-comment">// envoyer STOR Le téléchargement des commandes commence</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"STOR <span class="hljs-subst">$remote_file</span></span></span><span>\r\n");
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'150'</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Échec du téléchargement: <span class="hljs-subst">$response</span></span></span><span>");
}
</span><span><span class="hljs-comment">// Télécharger le contenu du fichier Bloc par bloc</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>
Fermez la connexion <br> Après avoir téléchargé le fichier, fermez la connexion FTP.
<span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"QUIT\r\n"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>);
</span></span>
Gestion des erreurs
Le protocole FTP implique plusieurs commandes et réponses, donc la gestion des erreurs est très importante. La réponse de chaque commande FTP contient un code d'état à trois chiffres (tel que 220 , 230 , 331 , etc.). En vérifiant ces codes d'état, vous pouvez déterminer si l'opération est réussie.
Mode passif et mode actif <br> Dans certains environnements réseau, l'utilisation du mode passif peut éviter le blocage des appareils NAT (traduction d'adresses réseau) et des pare-feu. Si le mode par défaut ne convient pas, n'oubliez pas de passer en mode passif.
Mode binaire et ASCII <br> Lors du téléchargement de fichiers, vous devez assurer les paramètres corrects du mode de transfert de fichiers. Pour les fichiers binaires (tels que les images, les vidéos, les fichiers compressés, etc.), le mode binaire (c'est-à-dire le type I ) doit être utilisé. Pour les fichiers texte, utilisez le mode ASCII (c'est-à-dire le type A ).
Taille du tampon <br> Pendant le téléchargement de fichiers, lors de la lecture et de l'écriture des opérations, vous pouvez améliorer les performances de téléchargement en ajustant la taille du tampon. Les tailles de tampon de Fread () et Fputs () affecteront la vitesse de transmission des données.
Empêcher les fuites des ressources <br> Après avoir créé une connexion de socket via fsocopen () , assurez-vous de ne pas vous rappeler de fermer la connexion une fois le téléchargement terminé pour éviter la fuite des ressources.
Bien qu'il soit relativement bas pour implémenter le téléchargement de fichiers FTP via fsocckopen () , il donne aux développeurs plus de contrôle sur le transfert de fichiers. En mettant en œuvre manuellement chaque étape du protocole FTP, nous pouvons effectuer des opérations personnalisées dans des scénarios complexes. Cependant, lorsque vous l'utilisez, vous devez faire attention aux détails du protocole, à la gestion des erreurs, au mode de transmission et à d'autres problèmes pour assurer la progression fluide du processus de téléchargement. Pour les exigences de téléchargement de fichiers régulières, la fonction FTP intégrée de PHP peut être utilisée pour simplifier les opérations, tandis que les opérations de téléchargement personnalisées via FSOCCKOpen () conviennent aux scénarios qui nécessitent un contrôle plus détaillé.
Étiquettes associées:
FTP