(PHP 4 >= 4.3.0, PHP 5)
ftp_nb_fput — Speichert eine geöffnete Datei auf den FTP-Server (nicht blockierend)
ftp_nb_fput() lädt Datei von einem Dateizeiger in eine entfernte Datei auf einem FTP-Server.
Der Unterscheid zwischen dieser Funktion und ftp_fput() ist, dass diese Funktion die Datei asynchron hochlädt, so dass Ihr Programm noch andere Operationen ausführen kann während die Datei hochgeladen wird.
Der Verbindungshandler der FTP-Verbindung.
Der Pfad zur Datei auf dem Server.
Ein geöffneter Dateizeiger zu einer lokalen Datei. Das Lesen wird am Dateiende beendet.
Der Transfer-Modus. Muss entweder FTP_ASCII oder FTP_BINARY sein.
Gibt FTP_FAILED oder FTP_FINISHED oder FTP_MOREDATA zurück.
Beispiel #1 ftp_nb_fput()-Beispiel
<?php
$file = 'index.php';
$fp = fopen($file, 'r');
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// Upload initialisieren
$ret = ftp_nb_fput($conn_id, $file, $fp, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
   // Irgendwas machen
   echo ".";
   // Upload fortsetzen
   $ret = ftp_nb_continue($conn_id);
}
if ($ret != FTP_FINISHED) {
   echo "Beim Transfer trat ein Fehler auf";
   exit(1);
}
fclose($fp);
?>
There is an easy way to check progress while uploading a file.  Just use the ftell function to watch the position in the file handle.  ftp_nb_fput will increment the position as the file is transferred.
Example:
<?
    $fh = fopen ($file_name, "r");
    $ret = ftp_nb_fput ($ftp, $file_name, $fh, FTP_BINARY);
    while ($ret == FTP_MOREDATA) {
        print ftell ($fh)."\n";
        $ret = ftp_nb_continue($ftp);
    }
    if ($ret != FTP_FINISHED) {
        print ("error uploading\n");
        exit(1);
    }
    fclose($fh);
?>
This will print out the number of bytes transferred thus far, every time the loop runs.  Coverting this into a percentage is simply a matter of dividing the number of bytes transferred by the total size of the file.
While trying to create a progress bar for uploading files with the ftp_nb_fput() function
I've noticed that the ftp_size() function will not work during the upload  progess if you are using the
same resource handle. 
<?php
    // This will not work
    // ...
    $ret = ftp_nb_fput($conn_id, $remote_file, $fp, FTP_BINARY);
    while ($ret == FTP_MOREDATA) {
        // ...
        $remote_file_size = ftp_size($conn_id, $remote_file);
        // ...
        $ret = ftp_nb_continue($conn_id);
    }
    // ...
?>
However, by creating a new connection to the server you can retrieve current file size of the uploaded file, then
compare it with your local file to calculate the progress. A full example follows:
<?php
    ob_end_flush();
    $remote_file = 'remote.txt';
    $local_file = 'local.txt';
    $fp = fopen($local_file, 'r');
    $conn_id = ftp_connect($ftp_server);
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    $ret = ftp_nb_fput($conn_id, $remote_file, $fp, FTP_BINARY);
    while ($ret == FTP_MOREDATA) {
        // Establish a new connection to FTP server
        if(!isset($conn_id2)) {
            $conn_id2 = ftp_connect($ftp_server);
            $login_result2 = ftp_login($conn_id2, $ftp_user_name, $ftp_user_pass);
        }
        
        // Retreive size of uploaded file.
        if(isset($conn_id2)) {
            clearstatcache(); // <- this must be included!!
            $remote_file_size = ftp_size($conn_id2, $remote_file);
        }
       // Calculate upload progress
       $local_file_size  = filesize($local_file);
       if (isset($remote_file_size) && $remote_file_size > 0 ){
           $i = ($remote_file_size/$local_file_size)*100;
           printf("%d%% uploaded<br>", $i);
           flush();
       }  
        $ret = ftp_nb_continue($conn_id);
    }
    if ($ret != FTP_FINISHED) {
        print("There was an error uploading the file...<br>");
        exit(1);
    }
    else {
        print("Done.<br>");
    }
    fclose($fp);
?>