ftp_nb_fget()
Функция ftp_nb_fget() в PHP загружает файл с FTP-сервера в локальный файл в неблокирующем режиме.
Понимание функции PHP ftp_nb_fget()
Функция ftp_nb_fget() — это встроенная функция PHP, которая загружает файл с FTP-сервера и записывает его в локальный файл в неблокирующем режиме. В этой статье представлено полное руководство по её использованию в ваших PHP-проектах.
Что такое ftp_nb_fget()?
Функция ftp_nb_fget() загружает удалённый файл и записывает его в уже открытый локальный файловый указатель без блокировки скрипта. Неблокирующий режим означает, что вызов возвращается немедленно, вместо того чтобы приостанавливать выполнение до полной передачи файла, поэтому скрипт может продолжать выполнять другую работу, пока загрузка идёт в фоновом режиме.
Функция принимает четыре параметра (три обязательных, один необязательный):
| Параметр | Обязательный | Описание |
|---|---|---|
ftp_stream | Да | Идентификатор соединения, возвращённый функцией ftp_connect(). |
handle | Да | Открытый локальный файловый указатель (из fopen()), в который записываются данные. |
remote_file | Да | Путь к файлу на FTP-сервере. |
mode | Да (PHP < 7.3) | Режим передачи: FTP_ASCII или FTP_BINARY. Необязательный, по умолчанию FTP_BINARY, начиная с PHP 7.3. |
resumepos | Нет | Смещение в байтах в удалённом файле, с которого следует продолжить загрузку. По умолчанию 0. |
Функция возвращает одну из трёх констант:
FTP_FINISHED— передача завершена успешно.FTP_MOREDATA— передача ещё продолжается; вызовитеftp_nb_continue(), чтобы продолжить.FTP_FAILED— произошла ошибка.
Блокирующий vs. неблокирующий режим: блокирующий аналог —
ftp_fget(), который возвращается только после полной передачи файла. Используйтеftp_nb_fget(), когда нужно отображать прогресс, выполнять другую работу или передавать несколько файлов квазипараллельно.
Синтаксис ftp_nb_fget()
Синтаксис функции ftp_nb_fget() выглядит следующим образом:
Синтаксис ftp_nb_fget()
int ftp_nb_fget ( resource $ftp_stream , resource $handle , string $remote_file , int $mode [, int $resumepos = 0 ] )Используйте FTP_BINARY для любых нетекстовых файлов (изображений, архивов, исполняемых файлов), чтобы байты копировались без изменений; FTP_ASCII преобразует концы строк и должен использоваться только для текстовых файлов. Параметр resumepos удобен для продолжения частично загруженного файла: передайте размер локального файла, чтобы передача возобновилась с того места, где остановилась, а не начиналась заново.
Использование ftp_nb_fget()
Для использования функции ftp_nb_fget() сначала необходимо установить соединение с FTP-сервером с помощью функции ftp_connect(). Пример:
Использование 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);
?>В этом примере мы устанавливаем соединение с FTP-сервером с помощью ftp_connect(), затем выполняем вход через ftp_login(). Открываем файл для записи с помощью fopen() и инициируем асинхронную FTP-операцию с помощью ftp_nb_fget(). Продолжаем операцию, вызывая ftp_nb_continue() внутри цикла while, который проверяет константу FTP_MOREDATA. Наконец, проверяем результат и закрываем файл и FTP-соединение.
Обработка ошибок в ftp_nb_fget()
При использовании функции ftp_nb_fget() важно правильно обрабатывать ошибки. Функция и ftp_nb_continue() возвращают константы состояния, а не простые булевы значения. Пример обработки ошибок и проверки состояний передачи:
Обработка ошибок в 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);
?>Связанные функции
ftp_fget()— блокирующая версия, загружающая файл в открытый файловый указатель.ftp_nb_get()— неблокирующая загрузка напрямую по локальному пути (безfopen()).ftp_nb_continue()— управляет передачей, начатойftp_nb_fget().ftp_nb_fput()— неблокирующий аналог для загрузки файлов на сервер.ftp_connect()иftp_login()— открытие и аутентификация соединения.
Заключение
Функция ftp_nb_fget() загружает файлы с FTP-сервера в неблокирующем режиме, позволяя скрипту продолжать выполнять другую работу в процессе загрузки. Всегда выполняйте цикл с ftp_nb_continue() пока состояние равно FTP_MOREDATA, и проверяйте итоговую константу (FTP_FINISHED или FTP_FAILED) перед тем, как считать файл полностью полученным.
Примечание: Расширение FTP считается устаревшим. Для современных приложений предпочтительнее использовать SFTP (через расширение
ssh2илиphpseclib) или асинхронные HTTP-клиенты для повышения безопасности и производительности.