(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
ftp_nb_fget — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в открытом заранее файле
$ftp,$stream,$remote_filename,$mode = FTP_BINARY ,$offset = 0Функция ftp_nb_fget() скачивает файл с удалённого FTP-сервера.
Разница между этой функцией и функцией ftp_fget() заключается в том, что эта функция получает файл асинхронно, поэтому программе доступны другие операции, пока файл скачивается.
ftpstreamОткрытый файловый дескриптор для сохранения данных.
remote_filenameПуть к удалённому файлу.
mode
Режим передачи. Параметр принимает либо константу FTP_ASCII ,
либо константу FTP_BINARY .
offsetПозиция начала загрузки в удалённом файле.
Функция возвращает значения FTP_FAILED , FTP_FINISHED
или FTP_MOREDATA .
| Версия | Описание |
|---|---|
| 8.1.0 |
Параметр ftp теперь принимает объект FTP\Connection ;
раньше параметр ждал ресурс (resource ).
|
| 7.3.0 |
Параметр mode сделали необязательным,
раньше параметр был обязательным.
|
Пример #1 Пример скачивания файла с FTP-сервера в асинхронном режиме функцией ftp_nb_fget()
<?php
// Открываем файл для записи
$file = 'index.php';
$fp = fopen($file, 'w');
$ftp = ftp_connect($ftp_server);
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);
// Начало скачивания
$ret = ftp_nb_fget($ftp, $fp, $file, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
// Выполняем какие-то действия...
echo ".";
// Продолжение скачивания...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При скачивании файла возникла ошибка...";
exit(1);
}
// Закрываем файл
fclose($fp);
?>
If you want to monitor the progress of the download, you may use the filesize()-Function.
But note: The results of said function are cached, so you'll always get 0 bytes. Call clearstatcache() before calling filesize() to determine the actual size of the downloaded file.
This may have performance implications, but if you want to provide the information, there's no way around it.
Above sample extended:
<?php
// get the size of the remote file
$fs = ftp_size($my_connection, "test");
// Initate the download
$ret = ftp_nb_get($my_connection, "test", "README", FTP_BINARY);
while ($ret == FTP_MOREDATA) {
clearstatcache(); // <- this is important
$dld = filesize($locfile);
if ( $dld > 0 ){
// calculate percentage
$i = ($dld/$fs)*100;
printf("\r\t%d%% downloaded", $i);
}
// Continue downloading...
$ret = ftp_nb_continue ($my_connection);
}
if ($ret != FTP_FINISHED) {
echo "There was an error downloading the file...";
exit(1);
}
?>
Philip