ftp_nb_fget()
La funzione ftp_nb_fget() di PHP recupera un file dal server FTP e lo scrive in un file locale in modalità non bloccante.
Comprendere la funzione PHP ftp_nb_fget()
La funzione ftp_nb_fget() è una funzione PHP integrata che recupera un file da un server FTP e lo scrive in un file locale utilizzando la modalità non bloccante. Questo articolo fornisce una guida completa su come utilizzarla nei tuoi progetti PHP.
Cos'è ftp_nb_fget()?
La funzione ftp_nb_fget() recupera un file remoto e lo scrive in un puntatore a file locale già aperto senza bloccare lo script. Non bloccante significa che la chiamata ritorna immediatamente invece di attendere che l'intero file sia stato trasferito, quindi lo script può continuare a svolgere altre operazioni mentre il download avviene in background.
Accetta quattro parametri (tre obbligatori, uno opzionale):
| Parametro | Obbligatorio | Descrizione |
|---|---|---|
ftp_stream | Sì | L'identificatore di connessione restituito da ftp_connect(). |
handle | Sì | Un puntatore a file locale aperto (da fopen()) in cui vengono scritti i dati. |
remote_file | Sì | Il percorso del file sul server FTP. |
mode | Sì (PHP < 7.3) | Modalità di trasferimento: FTP_ASCII o FTP_BINARY. Opzionale e predefinito su FTP_BINARY da PHP 7.3. |
resumepos | No | Offset in byte nel file remoto da cui riprendere. Il valore predefinito è 0. |
La funzione restituisce una di tre costanti:
FTP_FINISHED— il trasferimento è completato con successo.FTP_MOREDATA— il trasferimento è ancora in corso; chiamaftp_nb_continue()per continuare.FTP_FAILED— si è verificato un errore.
Bloccante vs. non bloccante: l'equivalente bloccante è
ftp_fget(), che ritorna solo quando il file è completamente trasferito. Utilizzaftp_nb_fget()quando vuoi mostrare l'avanzamento, eseguire altre operazioni o trasferire più file in modo quasi parallelo.
Sintassi di ftp_nb_fget()
La sintassi della funzione ftp_nb_fget() è la seguente:
Sintassi di ftp_nb_fget()
int ftp_nb_fget ( resource $ftp_stream , resource $handle , string $remote_file , int $mode [, int $resumepos = 0 ] )Usa FTP_BINARY per qualsiasi file non testuale (immagini, archivi, eseguibili) in modo che i byte vengano copiati in modo verbatim; FTP_ASCII converte le terminazioni di riga e deve essere usato solo per file di testo normale. Il parametro resumepos è utile per riprendere un file parzialmente scaricato: passa la dimensione del file locale in modo che il trasferimento riprenda da dove era rimasto invece di ricominciare dall'inizio.
Utilizzo di ftp_nb_fget()
Per utilizzare la funzione ftp_nb_fget(), devi prima stabilire una connessione al server FTP usando la funzione ftp_connect(). Ecco un esempio:
Utilizzo di ftp_nb_fget()
<?php
// Set up an FTP connection
$conn = ftp_connect('ftp.example.com');
ftp_login($conn, 'username', 'password');
// Open a file for writing
$handle = fopen('local_file.txt', 'w');
// Initiate an asynchronous FTP operation
$result = ftp_nb_fget($conn, $handle, 'remote_file.txt', FTP_BINARY);
// Continue the asynchronous FTP operation
while ($result === FTP_MOREDATA) {
// Do something else while waiting for the FTP operation to complete
$result = ftp_nb_continue($conn);
}
// Check final result
if ($result === FTP_FINISHED) {
echo "Download completed successfully.";
} else {
echo "Download failed.";
}
fclose($handle);
ftp_close($conn);
?>In questo esempio, stabiliamo una connessione al server FTP usando ftp_connect(). Poi effettuiamo il login con ftp_login(). Apriamo un file in scrittura con fopen() e avviamo un'operazione FTP asincrona con ftp_nb_fget(). Continuiamo l'operazione usando ftp_nb_continue() all'interno di un ciclo while che verifica la costante FTP_MOREDATA. Infine, controlliamo il risultato e chiudiamo il file e la connessione FTP.
Gestione degli errori in ftp_nb_fget()
È importante gestire correttamente gli errori quando si utilizza la funzione ftp_nb_fget(). La funzione e ftp_nb_continue() restituiscono costanti di stato anziché semplici valori booleani. Ecco un esempio di come gestire gli errori e verificare gli stati del trasferimento:
Gestione degli errori in ftp_nb_fget()
<?php
// Assuming $conn is an established FTP connection
$handle = fopen('local_file.txt', 'w');
$result = ftp_nb_fget($conn, $handle, 'remote_file.txt', FTP_BINARY);
if ($result === FTP_FAILED) {
echo "Failed to start download.\n";
} else {
while ($result === FTP_MOREDATA) {
$result = ftp_nb_continue($conn);
}
if ($result === FTP_FINISHED) {
echo "Download completed successfully.\n";
} else {
echo "Download failed during transfer.\n";
}
}
fclose($handle);
ftp_close($conn);
?>Funzioni correlate
ftp_fget()— la versione bloccante che scarica in un puntatore a file aperto.ftp_nb_get()— download non bloccante direttamente verso un percorso locale (senza bisogno difopen()).ftp_nb_continue()— gestisce il trasferimento avviato daftp_nb_fget().ftp_nb_fput()— la controparte non bloccante per il caricamento.ftp_connect()eftp_login()— aprono e autenticano la connessione.
Conclusione
La funzione ftp_nb_fget() recupera file da un server FTP in modalità non bloccante, consentendo allo script di continuare con altre operazioni mentre il download procede. Esegui sempre il ciclo su ftp_nb_continue() finché lo stato è FTP_MOREDATA, e controlla la costante finale (FTP_FINISHED o FTP_FAILED) prima di considerare il file completo.
Nota: L'estensione FTP è considerata legacy. Per le applicazioni moderne, preferisci SFTP (tramite l'estensione
ssh2ophpseclib) o client HTTP asincroni per maggiore sicurezza e prestazioni.