Задача
Необходимо переправить файлы с помощью FTP.
Решение
Для этого применяются встроенные FTP-функции PHP:
$c = ftp_connect('ftp.example.com') or die("Can't connect");
ftp_login($c, $username, $password) or die("Can't login");
ftp_put($c, $remote, $local, FTP_ASCII) or die("Can't transfer");
ftp_close($c); or die("Can't close");
Можно также использовать расширение cURL:
$c = curl_init("ftp://$username:$password@ftp.example.com/$remote");
// переменная $local – это местоположение сохраняемого файла
// на локальной машине
$fh = fopen($local, 'w') or die($php_errormsg);
curl_setopt($c, CURLOPT_FILE, $fh);
curl_exec($c);
curl_close($c);
Обсуждение
FTP (File Transfer Protocol) означает протокол передачи файлов и представляет собой способ обмена файлами между двумя компьютерами. В отличие от HTTP-серверов, FTP-сервер легко установить как для отправки файлов, так и для их получения.
Работа с встроенными FTP-функциями не требует дополнительных библиотек, но необходимо предварительно разрешить применение самих этих функций с помощью параметра --enable-ftp. Эти функции разработаны специально для FTP, поэтому передача файлов с их помощью организуется без труда.
Все транзакции FTP начинаются с того, что ваш компьютер (локальный клиент), устанавливает соединение с другим компьютером (удаленным сервером):
$c = ftp_connect('ftp.example.com') or die("Can't connect");
После того как соединение установлено, необходимо послать на сервер имя пользователя и пароль, тогда удаленный сервер сможет идентифицировать вас и разрешить (или не разрешить) вам войти:
ftp_login($c, $username, $password) or die("Can't login");
Некоторые FTP-серверы поддерживают возможность, известную как анонимный доступ FTP. При анонимном доступе FTP пользователь может войти, не имея персональной учетной записи на удаленном сервере. В случае выбора анонимного доступа ваше имя пользователя
должно быть определено как anonymous, а паролем служит ваш адрес электронной почты.
Ниже показано, как передать файлы с помощью функций ftp_put()и ftp_get():
ftp_put($c, $remote, $local, FTP_ASCII) or die("Can't transfer");
ftp_get($c, $local, $remote, FTP_ASCII) or die("Can't transfer");
Функция ftp_put() принимает файл, находящийся на вашем компьютере, и копирует его на удаленный сервер; функция ftp_get() копирует файл с удаленного сервера на ваш компьютер. В предыдущем фрагменте кода переменная $remote хранит путь к удаленному файлу, а переменная $local указывает на файл, находящийся на вашем компьютере.Этим функциям также передаются еще два параметра. Параметр FTP_ASCII (используемый в данном случае) сообщает о том, что файл передается как ASCII-текст. В этом случае завершающий символ перевода строки автоматически конвертируется при переходе от системы к системе. Есть и другой параметр, FTP_BINARY, указываемый для файлов, не являющихся простым текстом; при этом символ перевода строки не конвертируется.
Функции ftp_fget() и ftp_fput() позволяют загрузить и выгрузить файл через уже существующий указатель открытого файла (открытого с помощью функции fopen()) вместо использования точного местоположения в файловой системе. Например, ниже показано, как извлечь и записать файл по существующему указателю файла, $fp:
$fp = fopen($file, 'w');
ftp_fget($c, $fp, $remote, FTP_ASCII) or die("Can't transfer");
Наконец, чтобы закрыть соединение с удаленным хостом, вызовите функцию ftp_close():
ftp_close($c); or die("Can't close");
Для того чтобы установить продолжительность соединения в секундах, применяется функция ftp_set_option():
// Время до выхода – две минуты:
set_time_limit(120)
$c = ftp_connect('ftp.example.com');
ftp_set_option($c, FTP_TIMEOUT_SEC, 120);
Значение по умолчанию равно 90 секундам; однако по умолчанию значение параметра max_execution_time сценария PHP равно 30 секундам. Поэтому надо проверить оба значения, если соединение закрывается слишком рано.
Для того чтобы с расширением cURL можно было работать, необходимо загрузить его с http://curl.haxx.se/ и установить параметр конфигурации --with-curl во время сборки PHP. Применение cURL начните с создания дескриптора cURL с помощью функции curl_init(), а затем укажите, что вы хотите сделать, вызвав функцию curl_setopt(). Последняя принимает три параметра: источник cURL, имя модифицируемой константы cURL и значение, присваиваемое второму параметру. В разделе «Решение» это константа CURLOPT_FILE:
$c = curl_init("ftp://$username:$password@ftp.example.com/$remote");
// переменная $local содержит путь к сохраняемому файлу на локальной машине
$fh = fopen($local, 'w') or die($php_errormsg);
curl_setopt($c, CURLOPT_FILE, $fh);
curl_exec($c);
curl_close($c);
Передаем URL в функцию curl_init(). Поскольку URL начинается с ftp://, cURL сам узнает, что должен применяться протокол FTP.того чтобы входить на сервер, реализуя отдельный вызов, вставляйте имя пользователя и пароль непосредственно в URL. Затем укажите местоположение сохраняемого файла на вашем сервере. Теперь откройте файл с именем $local на запись и передайте дескриптор файла функции curl_setopt() в качестве значения константы CURLOPT_FILE. Передавая файл, cURL автоматически записывает данные в дескриптор файла. После того как все сконфигурировано, вызывается функция curl_exec(), инициализирующая транзакцию, а затем функция curl_close(), закрывающая соединение.