W3docs

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|false

ftp_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-функциями для создания надёжных скриптов передачи файлов.

Практика

Практика
Что делает функция PHP ftp_systype()?
Что делает функция PHP ftp_systype()?
Was this page helpful?