ftp_systype()
La funzione ftp_systype() è una funzione PHP integrata che recupera il tipo di sistema del server FTP remoto. In questo articolo la esaminiamo.
La funzione PHP ftp_systype()
ftp_systype() interroga un server FTP connesso per conoscere il tipo di sistema operativo in esecuzione e restituisce quella risposta come string. Questa pagina spiega cosa restituisce la funzione, perché la risposta è importante, come chiamarla in modo sicuro e come si integra con le altre funzioni FTP di PHP.
Perché il tipo di sistema è importante
I server FTP espongono due famiglie di comportamenti molto diverse a seconda del sistema operativo host:
UNIX— i percorsi usano la barra obliqua (/var/www), i nomi dei file sono sensibili alle maiuscole e le directory listing seguono il classico layoutls -l.Windows_NT— i percorsi possono usare la barra rovescia, i nomi dei file non sono sensibili alle maiuscole e i formati delle listing differiscono.
Conoscere il tipo di sistema in anticipo permette di costruire percorsi remoti corretti, scegliere la modalità di trasferimento giusta e analizzare le directory listing senza dover indovinare. Il valore proviene direttamente dalla risposta SYST del server, quindi riflette quanto il server riporta — tipicamente UNIX Type: L8 o Windows_NT.
Sintassi
ftp_systype(FTP\Connection $ftp): string|falseftp_systype() accetta un singolo argomento:
$ftp— una connessione FTP attiva restituita daftp_connect()oftp_ssl_connect().
Restituisce il tipo di sistema remoto come string in caso di successo (ad esempio "UNIX"), oppure false in caso di errore.
Nota sulla versione: a partire da PHP 8.1 le funzioni FTP accettano e restituiscono un oggetto
FTP\Connection. In PHP 8.0 e precedenti lo stesso codice usava unaresource— gli script esistenti continuano a funzionare senza modifiche, è cambiato solo il nome del tipo sottostante.
Utilizzo di base
È necessario connettersi ed effettuare il login prima di chiamare ftp_systype(), poi chiudere la connessione al termine:
<?php
// Connect to the remote FTP server
$conn = ftp_connect('ftp.example.com');
// Login with your FTP credentials
ftp_login($conn, 'username', 'password');
// Get the remote FTP server's system type
$system_type = ftp_systype($conn);
if ($system_type === false) {
echo "Failed to retrieve the remote FTP server's system type.\n";
} else {
echo "The remote FTP server's system type is: $system_type\n";
}
// Close the FTP connection
ftp_close($conn);Su un tipico server FTP Linux questo produce un output simile a:
The remote FTP server's system type is: UNIXSi noti che la risposta SYST grezza è spesso più lunga (UNIX Type: L8); PHP la normalizza alla prima parola, quindi di solito si riceve solo UNIX o Windows_NT.
Adattare il comportamento al tipo di sistema
Il motivo pratico per chiamare ftp_systype() è ramificare la logica. Ad esempio, si potrebbe scegliere un separatore di percorso in base all'host:
<?php
$conn = ftp_connect('ftp.example.com');
ftp_login($conn, 'username', 'password');
$type = ftp_systype($conn);
$separator = ($type === 'Windows_NT') ? '\\' : '/';
$remotePath = 'public_html' . $separator . 'index.html';
echo "Using path: $remotePath\n";
ftp_close($conn);Su un server UNIX questo produce public_html/index.html; su un server Windows produce public_html\index.html.
Gestione degli errori
ftp_systype() restituisce false in caso di errore, e ftp_connect() stesso restituisce false se non riesce a raggiungere l'host. Verificare entrambi prima di fare affidamento sul risultato:
<?php
$conn = ftp_connect('ftp.example.com');
if ($conn === false) {
echo "Failed to connect to the remote FTP server.\n";
} else {
$system_type = ftp_systype($conn);
if ($system_type === false) {
echo "Failed to retrieve the remote FTP server's system type.\n";
} else {
echo "The remote FTP server's system type is: $system_type\n";
}
// Close the FTP connection
ftp_close($conn);
}Testare sempre il valore restituito con il confronto stretto === false. Un controllo lasso (!$type) potrebbe dare falsi positivi se un server restituisse mai una string vuota ma valida.
Insidie comuni
- Chiamarla prima del login. Alcuni server rifiutano
SYSTfino al completamento dell'autenticazione. Effettuare il login prima. - Fidarsi ciecamente della string. Il valore è ciò che il server pubblicizza e alcuni server riportano string insolite. Verificare su una sottostringa (
str_contains($type, 'Windows')) anziché una corrispondenza esatta quando si vuole essere robusti. - Confonderla con il trasferimento di file.
ftp_systype()riporta solo il sistema operativo — non sposta file. Usareftp_get()eftp_put()per download e upload.
Funzioni FTP correlate
ftp_connect()— apre la connessione da passare aftp_systype().ftp_login()— autentica prima di eseguire i comandi.ftp_pwd()— ottiene la directory remota corrente.ftp_close()— rilascia la connessione al termine.
Conclusione
ftp_systype() è una funzione piccola ma utile: una singola chiamata indica se si sta comunicando con un server FTP UNIX o Windows, permettendo di costruire percorsi corretti e analizzare le listing in modo affidabile. Abbinarla a un controllo rigoroso degli errori e alle funzioni FTP correlate sopra indicate per script di trasferimento file robusti.