Wenn Sie die Funktion ftp_System () aufrufen, ist die erwartete Rückgabe etwas wie die folgende:
$system = ftp_systype($ftp_conn);
echo $system; // Unter normalen Umständen sollte die Ausgabe sein:UNIX oder Windows NT
Aber die tatsächliche Ausgabe könnte sein:
UNKNOWN
FTP_Systeme () ist der zugrunde liegende Systembefehl , der sich auf FTP stützt, um den Systemtyp zu erhalten. Wenn der Server nicht auf diesen Befehl reagiert oder eine nicht standardmäßige Antwort zurückgibt, wird PHP möglicherweise nicht analysiert, wodurch "unbekannt" zurückgegeben wird.
Diagnosemethode:
Sie können ftp_raw () verwenden, um Befehle manuell zu senden, um Serverantworten anzuzeigen:
$response = ftp_raw($ftp_conn, "SYST");
print_r($response);
Wenn die von Ihnen angezeigte Antwort nicht mit einem Stammgast wie 215 UNIX -Typ: L8 beginnt, sondern einen leeren oder Ausnahmetext hat, bedeutet dies, dass der Server nicht mit dem SYSTEM -Befehl kompatibel ist.
Aus Sicherheitsgründen können einige FTP-Dienstleister den SYSTE -Befehl deaktivieren, oder ihre FTP-Server sind nicht standardmäßige Implementierungen (wie einige eingebettete Geräte, FTP-Dienste in Router usw.).
Vorschläge lösen:
Sie können sich an den FTP -Dienstanbieter wenden, um zu bestätigen, ob der Systembefehl deaktiviert ist. Wenn Sie Ihren eigenen konfigurierten FTP -Dienst verwenden (z. B. VSFTPD, ProfTPD usw.), können Sie überprüfen, ob die SYNT_ENABLE- oder die zugehörigen Optionen in der Konfigurationsdatei geschlossen sind.
Ältere Versionen von PHP oder einigen benutzerdefinierten Builds können Probleme mit der Implementierung von FTP_Systype () haben.
Diagnosemethode:
Drucken Sie die PHP -Version aus und stellen Sie sicher, dass der FTP -Support aktiviert ist:
phpinfo();
Bestätigen Sie, ob das FTP -Support -Element aktiviert ist und ob die PHP -Version neuer ist (es wird empfohlen, mindestens PHP 7.4 oder höher zu verwenden).
Transparente Proxy- und Firewall -Geräte in bestimmten Netzwerkumgebungen können FTP -Anweisungen abfangen, insbesondere bei der Verwendung des passiven Modus.
Vorschläge lösen:
Versuchen Sie, den aktiven/passiven Modus zu wechseln, um festzustellen, ob Verbesserungen vorliegen:
ftp_pasv($ftp_conn, true); // Verwenden Sie den passiven Modus
oder:
ftp_pasv($ftp_conn, false); // Verwenden Sie den aktiven Modus
Wenn dies das Problem lösen kann, bedeutet dies, dass das Problem während der Netzwerkübertragung in Eingriffe liegt.
Auch wenn der Systemtyp nicht erhalten werden kann, können die folgenden Strategien angewendet werden, um Programmabstürze oder logische Fehler zu vermeiden:
Wenn FTP_Systeme () "unbekannt" zurückgibt, können Sie einen Standardtyp festlegen, z. B. den Standardverarbeitungspfad auf UNIX:
$system = ftp_systype($ftp_conn);
if ($system === false || $system === "UNKNOWN") {
$system = "UNIX"; // Die Standardverarbeitung ist UNIX
}
Für bekannte FTP -Server können ihre Typen in Konfigurationsdateien definiert werden, ohne sich auf die automatische Identifizierung zu verlassen:
$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);