ftp_systype()
Функция ftp_systype() — встроенная функция PHP, возвращающая тип системы удалённого FTP-сервера. В этой статье рассматривается её применение.
Функция PHP ftp_systype()
ftp_systype() запрашивает у подключённого FTP-сервера информацию о типе его операционной системы и возвращает ответ в виде string. На этой странице рассказывается, что возвращает функция, почему эта информация важна, как вызывать её безопасно и как она соотносится с другими FTP-функциями PHP.
Почему тип системы важен
FTP-серверы ведут себя принципиально по-разному в зависимости от операционной системы хоста:
UNIX— пути используют прямые слэши (/var/www), имена файлов чувствительны к регистру, а листинги каталогов соответствуют привычному форматуls -l.Windows_NT— пути могут содержать обратные слэши, имена файлов нечувствительны к регистру, а форматы листингов отличаются.
Знание типа системы заранее позволяет строить корректные удалённые пути, выбирать правильный режим передачи и разбирать листинги каталогов без догадок. Значение берётся напрямую из ответа сервера на команду SYST, поэтому оно отражает то, что сообщает сам сервер, — как правило, UNIX Type: L8 или Windows_NT.
Синтаксис
ftp_systype(FTP\Connection $ftp): string|falseftp_systype() принимает один аргумент:
$ftp— активное FTP-соединение, возвращённое функциейftp_connect()илиftp_ssl_connect().
При успехе возвращает тип удалённой системы в виде string (например, "UNIX"), или false при ошибке.
Примечание о версии: начиная с PHP 8.1, FTP-функции принимают и возвращают объект
FTP\Connection. В PHP 8.0 и более ранних версиях использовался типresource— существующие скрипты продолжат работать без изменений, изменилось лишь название типа.
Базовое использование
Перед вызовом ftp_systype() необходимо подключиться и войти в систему, а после завершения работы закрыть соединение:
<?php
// Connect to the remote FTP server
$conn = ftp_connect('ftp.example.com');
// Login with your FTP credentials
ftp_login($conn, 'username', 'password');
// Get the remote FTP server's system type
$system_type = ftp_systype($conn);
if ($system_type === false) {
echo "Failed to retrieve the remote FTP server's system type.\n";
} else {
echo "The remote FTP server's system type is: $system_type\n";
}
// Close the FTP connection
ftp_close($conn);При подключении к типичному Linux FTP-серверу будет выведено нечто подобное:
The remote FTP server's system type is: UNIXОбратите внимание, что полный ответ на команду SYST зачастую длиннее (UNIX Type: L8); PHP нормализует его до первого слова, поэтому обычно вы получаете просто UNIX или Windows_NT.
Адаптация поведения в зависимости от типа системы
Практическая причина вызова ftp_systype() — ветвление логики. Например, можно выбрать разделитель пути в зависимости от хоста:
<?php
$conn = ftp_connect('ftp.example.com');
ftp_login($conn, 'username', 'password');
$type = ftp_systype($conn);
$separator = ($type === 'Windows_NT') ? '\\' : '/';
$remotePath = 'public_html' . $separator . 'index.html';
echo "Using path: $remotePath\n";
ftp_close($conn);На UNIX-сервере будет построен путь public_html/index.html; на Windows-сервере — public_html\index.html.
Обработка ошибок
ftp_systype() возвращает false при ошибке, а сама ftp_connect() вернёт false, если не сможет достичь хоста. Проверяйте обе функции, прежде чем доверять результату:
<?php
$conn = ftp_connect('ftp.example.com');
if ($conn === false) {
echo "Failed to connect to the remote FTP server.\n";
} else {
$system_type = ftp_systype($conn);
if ($system_type === false) {
echo "Failed to retrieve the remote FTP server's system type.\n";
} else {
echo "The remote FTP server's system type is: $system_type\n";
}
// Close the FTP connection
ftp_close($conn);
}Всегда проверяйте возвращаемое значение с помощью строгого сравнения === false. Нестрогая проверка (!$type) может дать ложный результат, если сервер когда-нибудь вернёт пустую, но корректную string.
Типичные ошибки
- Вызов до авторизации. Некоторые серверы отвергают команду
SYSTдо завершения аутентификации. Сначала войдите в систему. - Слепое доверие к string. Значение — это то, что рекламирует сам сервер, и некоторые серверы возвращают нестандартные string. Для надёжности используйте поиск подстроки (
str_contains($type, 'Windows')), а не точное совпадение. - Путаница с передачей файлов.
ftp_systype()только сообщает об операционной системе — она не перемещает файлы. Используйтеftp_get()иftp_put()для скачивания и загрузки.
Связанные FTP-функции
ftp_connect()— открывает соединение, передаваемое вftp_systype().ftp_login()— выполняет аутентификацию перед отправкой команд.ftp_pwd()— возвращает текущий удалённый каталог.ftp_close()— освобождает соединение по завершении работы.
Заключение
ftp_systype() — небольшая, но полезная функция: один вызов сообщает вам, работаете ли вы с UNIX- или Windows FTP-сервером, что позволяет строить корректные пути и надёжно разбирать листинги. Используйте её вместе со строгой обработкой ошибок и связанными FTP-функциями для создания надёжных скриптов передачи файлов.