Скрипт отправки файла на удаленный FTP-сервер
Когда отправка файла на FTP-сервер не единоразовая операция, а выполняемая с определенной периодичностью необходимость, тогда встает вопрос об автоматизации этого процесса. И не важно для чего это надо. Будь то сохранение резервных копий или какой-нибудь отчет. Главное это скрипт отправки любых файлов на удаленный FTP-сервер. И реализация его запуска через Cron. Именно такой скрипт и представлен в этой статье.
Поскольку для работы с протоколом FTP (File Transfer Protocol - протокол передачи файлов) не требуются внешние библиотеки или дополнительные расширения, привожу сразу код:
class Ftp
{
/** @var text Адрес FTP-сервера */
protected $host;
/** @var text Имя пользователя */
protected $login;
/** @var text Пароль пользователя */
protected $password;
/** @var boolean Требуется ли аутентификация */
protected $auth;
public function __construct($host, $login = null, $password = null)
{
$this->host = $host;
$this->login = $login;
$this->password = $password;
$this->auth = $login && $password;
}
/**
* Загружает файл на FTP-сервер.
*
* @param text $file Открытый файловый дескриптор или путь к локальному файлу.
* @param text $remoteFile Файл на FTP-сервере.
* @throws Exception
*/
public function put($file, $remoteFile = '/')
{
if (false === $connect = ftp_connect($this->host))
throw new Exception("Не удалось соединиться с сервером {$this->host}.");
if ($this->auth === true)
if (!ftp_login($connect, $this->login, $this->password))
throw new Exception("Ошибка аутентификации на {$this->host} для логина: {$this->login} и пароля: {$this->password}.");
$funcName = is_resource($file) ? 'ftp_fput' : 'ftp_put';
if (!$funcName($connect, $remoteFile, $file, FTP_BINARY))
throw new Exception("Ошибка отправки $remoteFile на {$this->host}.");
ftp_close($connect);
}
}
Как видно, код довольно прост. Можно отправлять как локальные файлы, так и открытый поток. Пример отправки локального файла:
$file = __DIR__ . '/file.pdf'; // Путь к локальному файлу.
$remoteFile = '/http/report/file.pdf'; // Файл на FTP-сервере.
$ftp = new Ftp('сервер', 'пользователь', 'пароль');
$ftp->put($file, $remoteFile);
И пример отправки открытого ранее потока:
$handle = fopen(__DIR__ . '/file.pdf', 'r'); // Открытый файловый дескриптор.
$remoteFile = '/http/report/file.pdf'; // Файл на FTP-сервере.
$ftp = new Ftp('сервер', 'пользователь', 'пароль');
$ftp->put($handle, $remoteFile);
fclose($handle);
Теперь мы можем загружать любые файлы на удаленный FTP-сервер. Дальше можно сделать консольную команду для вызова этого скрипта, использовать при загрузке файлов через web интерфейс или же приспособить под другие задачи.