Lorsque vous appelez la fonction ftp_systeme () , le rendement attendu est quelque chose comme les suivants:
$system = ftp_systype($ftp_conn);
echo $system; // Dans des circonstances normales, la production doit être:UNIX ou Windows NT
Mais la sortie réelle pourrait être:
UNKNOWN
FTP_SYSTEME () est la commande système sous-jacente qui s'appuie sur FTP pour obtenir le type de système. Si le serveur ne répond pas à cette commande ou ne renvoie pas une réponse non standard, PHP peut ne pas être analysé, renvoyant ainsi "inconnu" .
Méthode de diagnostic:
Vous pouvez utiliser ftp_raw () pour envoyer manuellement les commandes pour afficher les réponses du serveur:
$response = ftp_raw($ftp_conn, "SYST");
print_r($response);
Si la réponse que vous voyez ne commence pas par un régulier tel que 215 UNIX Type: L8 , mais a plutôt du texte vide ou exceptionnel, cela signifie que le serveur n'est pas compatible avec la commande SYST .
Pour des raisons de sécurité, certains fournisseurs de services FTP peuvent désactiver la commande SYST , ou leurs serveurs FTP sont des implémentations non standard (telles que certains appareils intégrés, des services FTP dans les routeurs, etc.).
Résoudre les suggestions:
Vous pouvez contacter le fournisseur de services FTP pour confirmer si la commande SYST est désactivée. Si vous utilisez votre propre service FTP configuré (tel que VSFTPD, ProfTPD, etc.), vous pouvez vérifier si les options SYST_ENABLE ou connexes sont fermées dans le fichier de configuration.
Les anciennes versions de PHP ou de certaines versions personnalisées peuvent avoir des problèmes avec la mise en œuvre de FTP_SYSTYPE () .
Méthode de diagnostic:
Imprimez la version PHP et assurez-vous que la prise en charge FTP est activée:
phpinfo();
Confirmez si l'élément de support FTP est activé et si la version PHP est plus récente (il est recommandé d'utiliser au moins 7,4 PHP ou plus).
Les dispositifs proxy et pare-feu transparents dans certains environnements réseau peuvent intercepter les instructions FTP, en particulier lors de l'utilisation du mode passif.
Résoudre les suggestions:
Essayez de changer le mode actif / passif pour voir s'il y a une amélioration:
ftp_pasv($ftp_conn, true); // Utiliser le mode passif
ou:
ftp_pasv($ftp_conn, false); // Utiliser le mode actif
Si cela peut résoudre le problème, cela signifie que le problème réside dans l'interférence pendant la transmission du réseau.
Même si le type de système ne peut pas être obtenu, les stratégies suivantes peuvent être adoptées pour éviter les accidents de programme ou les erreurs logiques:
Lorsque ftp_systeme () renvoie "inconnu" , vous pouvez définir un type par défaut, tel que le chemin de traitement par défaut vers UNIX:
$system = ftp_systype($ftp_conn);
if ($system === false || $system === "UNKNOWN") {
$system = "UNIX"; // Le traitement par défaut est UNIX
}
Pour les serveurs FTP connus, leurs types peuvent être définis dans des fichiers de configuration sans compter sur l'identification automatique:
$ftp_hosts = [
'ftp.gitbox.net' => 'UNIX',
'backup.gitbox.net' => 'Windows NT'
];
$host = parse_url($ftp_url, PHP_URL_HOST);
$system = $ftp_hosts[$host] ?? ftp_systype($ftp_conn);