Загрузка файла на ftp-сервер по FTP протоколу на PHP

$file_name    = 'файл для загрузки с путем';
$ftp_server    = 'your_domain.net';
$ftp_port    = 21;
$ftp_file    = 'имя файла с путем на ftp-сервере';
$ftp_user_name    = 'ftp-user';
$ftp_user_pass    = 'ftp-pass';
$error_to    = 'your@email.net'; // E-mail для сообщений об ошибках


$ftp = ftp_connect($ftp_server, $ftp_port, 20);
ftp_login($ftp, $ftp_user_name, $ftp_user_pass);
ftp_pasv($ftp, true); // Passive mode
if(!ftp_put($ftp, $ftp_file, $file_name, FTP_BINARY)){
    // Ошибка загрузки
    mail($error_to,
        'FTP-upload error',
        "There was a problem while uploading {$file_name} to {$ftp_server}.",
        "From: admin@htmlweb.ru\nContent-Type: text/plain; charset=utf-8");
}
ftp_close($ftp);

Вариант загрузки файла на ftp-сервер в асинхронном режиме с автодокачкой

$ftp_server    = 'your_domain.net';
$ftp_user_name    = 'ftp-user';
$ftp_user_pass    = 'ftp-pass';
$file = 'index.php';
$fp = fopen($file, 'r');
$ftp = ftp_connect($ftp_server);
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// Начало загрузки вместо FTP_AUTORESUME можно указать ftp_size($ftp,"test.remote") для докачки с места обрыва
$ret = ftp_nb_put($ftp, "test.remote", "test.local", FTP_BINARY, FTP_AUTORESUME);
while ($ret == FTP_MOREDATA) {

    // производим какие-то действия ...
    echo ".";

    // продолжение загрузки ...
    $ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
    echo "При загрузке файла произошла ошибка...";
    exit(1);
}

.