W3docs

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):

ParametroObbligatorioDescrizione
ftp_streamL'identificatore di connessione restituito da ftp_connect().
handleUn puntatore a file locale aperto (da fopen()) in cui vengono scritti i dati.
remote_fileIl percorso del file sul server FTP.
modeSì (PHP < 7.3)Modalità di trasferimento: FTP_ASCII o FTP_BINARY. Opzionale e predefinito su FTP_BINARY da PHP 7.3.
resumeposNoOffset 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; chiama ftp_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. Utilizza ftp_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 di fopen()).
  • ftp_nb_continue() — gestisce il trasferimento avviato da ftp_nb_fget().
  • ftp_nb_fput() — la controparte non bloccante per il caricamento.
  • ftp_connect() e ftp_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 ssh2 o phpseclib) o client HTTP asincroni per maggiore sicurezza e prestazioni.

Pratica

Pratica
Cosa fa la funzione PHP FTP_NB_FGET?
Cosa fa la funzione PHP FTP_NB_FGET?
Was this page helpful?