Когда отправка файла на 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 интерфейс или же приспособить под другие задачи.