ftp_set_option()
Функция ftp_set_option() в PHP устанавливает параметры времени выполнения для FTP-соединения. Узнайте о доступных опциях и их применении.
Функция ftp_set_option() настраивает поведение уже открытого FTP-соединения в PHP. С её помощью можно регулировать работу FTP-клиента — таймауты соединения, адресацию в пассивном режиме и автоматическое позиционирование при возобновлении загрузок — без разрыва и повторного установления соединения.
На этой странице описывается назначение каждой опции, когда её следует применять и как устанавливать параметры безопасно. Предполагается, что соединение уже открыто с помощью ftp_connect() (или ftp_ssl_connect()) и выполнена аутентификация через ftp_login().
Синтаксис
ftp_set_option(FTP\Connection $ftp, int $option, mixed $value): bool| Параметр | Тип | Описание |
|---|---|---|
$ftp | FTP\Connection | Идентификатор соединения, возвращённый функцией ftp_connect() или ftp_ssl_connect(). |
$option | int | Одна из констант FTP_*, перечисленных ниже. |
$value | mixed | Устанавливаемое значение. Его тип зависит от опции (int для таймаута, bool для остальных). |
Функция возвращает true при успехе или false, если опцию не удалось установить (например, когда $value имеет неверный тип для выбранного $option).
Примечание: В PHP 8.1+ первый аргумент представляет собой объект
FTP\Connection. В PHP 8.0 и более ранних версиях этоresource, возвращаемый функциейftp_connect(). Имя функции и её поведение при этом остаются прежними.
Базовое использование
Откройте соединение, выполните вход, затем установите опцию. Как правило, параметры задаются сразу после входа — до начала передачи файлов, чтобы новое поведение применялось ко всем передачам.
<?php
// Open a connection to the FTP server
$ftp = ftp_connect('ftp.example.com');
if (!$ftp) {
die('Could not connect to FTP server.');
}
// Authenticate
ftp_login($ftp, 'username', 'password');
// Abort any network operation that stalls for more than 30 seconds
ftp_set_option($ftp, FTP_TIMEOUT_SEC, 30);
// ... transfers happen here ...
ftp_close($ftp);Здесь мы устанавливаем соединение с помощью ftp_connect(), проходим аутентификацию через ftp_login(), снижаем сетевой таймаут до 30 секунд с помощью ftp_set_option() и наконец закрываем соединение функцией ftp_close().
Доступные опции
ftp_set_option() принимает следующие константы опций:
| Опция | Тип значения | По умолчанию | Что управляет |
|---|---|---|---|
FTP_TIMEOUT_SEC | int (секунды) | 90 | Максимальное время ожидания клиента для любой отдельной сетевой операции перед её прекращением. Увеличьте значение для медленных соединений или больших файлов; уменьшите для быстрого обнаружения ошибок. |
FTP_AUTOSEEK | bool | true | Если включено и передаётся ненулевое значение $resumepos/$startpos в функции вроде ftp_get() или ftp_put(), передача начинается с указанного смещения для возобновления. Отключите, чтобы всегда передавать файл целиком с начала. |
FTP_USEPASVADDRESS | bool | true | Определяет, доверять ли IP-адресу, который сервер возвращает в команде PASV. Установите в false, если сервер находится за NAT и сообщает недоступный внутренний адрес — тогда клиент продолжит использовать хост управляющего соединения. См. ftp_pasv(). |
FTP_TIMEOUT_SEC и FTP_USEPASVADDRESS — две опции, которые чаще всего приходится изменять в реальном коде: первая — при таймаутах передачи, вторая — когда пассивный режим не работает за брандмауэром.
Текущее значение любой из этих опций можно прочитать с помощью ftp_get_option().
Отключение автоматического позиционирования
Распространённая причина вызова ftp_set_option() — отключение FTP_AUTOSEEK. По умолчанию при возобновлении загрузки с ненулевого смещения происходит позиционирование в локальном файле. Если требуется, чтобы каждая загрузка перезаписывала файл с нулевого байта, отключите эту опцию:
<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'username', 'password');
// Force full transfers instead of resuming from an offset
ftp_set_option($ftp, FTP_AUTOSEEK, false);
ftp_close($ftp);Обработка ошибок
ftp_set_option() возвращает false (и выдаёт предупреждение), если значение не соответствует опции — например, при передаче строки вместо int. Проверяйте возвращаемое значение, чтобы молча проигнорированная опция не стала источником неожиданных проблем:
<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'username', 'password');
if (!ftp_set_option($ftp, FTP_TIMEOUT_SEC, 30)) {
echo "Failed to set the FTP timeout option.\n";
}
ftp_close($ftp);Всегда работайте с активным соединением: передача закрытого или недействительного соединения вызовет предупреждение, а не корректное значение false, поэтому устанавливайте параметры до вызова ftp_close().
Заключение
ftp_set_option() настраивает поведение открытого FTP-соединения — в первую очередь сетевой таймаут и обработку адресов пассивного режима за NAT. Устанавливайте параметры сразу после ftp_login(), проверяйте возвращаемое значение и используйте ftp_get_option() для проверки текущих настроек. Полный обзор работы с FTP смотрите в разделе PHP FTP.