Скрипт копирования папки по FTP. Нужна помощь.

Тема в разделе "PHP Pro", создана пользователем Yuryus, 7 окт 2009.

Статус темы:
Закрыта.
  1. Yuryus

    Yuryus

    Регистр.:
    3 апр 2007
    Сообщения:
    383
    Симпатии:
    145
    Скрипт
    index.php
    PHP:
    <?php
    set_time_limit
    (0);
    $ftp = new ftp_download();
    $ftp->ftp_init('ftp_host''ftp_user''ftp_pass''local_folder''ftp_folder');
    echo 
    "Общее время загрузки: ".$ftp->count_time."<br />";
    echo 
    "Общий объем файлов: ".$ftp->count_size."<br />";
    echo 
    "Файлов загружено: ".$ftp->count_size_total."<br />";
    ?>
    Необходимо подставить свои данные.

    ftp_host - адрес сервера (напр. localhost)
    ftp_user - имя пользователя на сервере (напр. user)
    ftp_pass - пароль
    local_folder - папка куда загружать файлы
    ftp_folder - папка откуда брать файлы (напр. download)

    ftp_download.php

    PHP:
    <?php
    ///////////////////////////////////////////////////////////////
    /**
     * Класс копирования файлов с ftp-сервера на сайт.
     * Автор файла:             niga (izra) izra.ru
     * Версия:                  1.1
     * Дата создания файла:     13 марта 2007  19:46
     * Дата редактирования:     13 марта 2007  21:32
     */
    ///////////////////////////////////////////////////////////////

    class ftp_download {
        
    //    Лист закачки.
        
    var $file_list = array();

        
    //    Настройки ftp.
        
    var $ftp_connection false;
        var 
    $ftp_host;
        var 
    $ftp_user;
        var 
    $ftp_pass;
        var 
    $ftp_folder;

        
    //    Локальная папка.
        
    var $local_folder;

        
    //    Информация.
        
    var $count_size_total;
        var 
    $count_size;
        var 
    $count_time;

        function 
    ftp_init($ftp_host$ftp_user$ftp_pass$local_folder$ftp_folder) {
            if (empty(
    $ftp_host) or empty($ftp_user) or empty($ftp_pass)) {
                echo 
    "Проверьте данные для подключения";
                return 
    false;
            }
            if (empty(
    $local_folder)) {
                echo 
    "Необходимо указать папку.";
                return 
    false;
            }
            if (!
    is_dir($local_folder)) {
                echo 
    "Указанной папки не существует.";
                return 
    false;
            }
            if (!
    is_writeable($local_folder)) {
                echo 
    "В текущую папку невозможно записать данные.<br />Укажите права доступа.";
                return 
    false;
            }

            
    $this->ftp_folder ereg_replace("/"""$this->ftp_folder);
            
    $this->local_folder = ($this->local_folder[strlen($this->local_folder) - 1] == '/')?$this->local_folder:$this->local_folder.'/';

            
    $this->ftp_host $ftp_host;
            
    $this->ftp_user $ftp_user;
            
    $this->ftp_pass $ftp_pass;
            
    $this->ftp_folder $ftp_folder;
            
    $this->local_folder $local_folder;

            if (!
    $this->open_ftp_conection()) {
                echo 
    "Невозможно создать подключение.<br />Проверьте правильность данных для подключения.";
                return 
    false;
            }

            
    $start_time $this->get_time();
            if (!
    is_file($this->local_folder.'lock_file')) {
                
    $this->create_list();
                
    $this->create_lock_file();
            }
            if (
    is_file($this->local_folder.'lock_file')) {
                
    $this->update_lock_file();
                
    $this->delete_lock_file();
            }
            
    $end_time $this->get_time();
            
    $this->count_time round($end_time $start_time3);
            
    $this->count_size $this->convert($this->count_size);
            
    $this->count_size_total $this->convert($this->count_size_total);
        }

        function 
    get_time() {
            list(
    $seconds$microSeconds) = explode(' 'microtime());
            return ((float)
    $seconds + (float)$microSeconds);
        }

        function 
    open_ftp_conection() {
            
    $return false;
            
    $this->ftp_connection ftp_connect($this->ftp_host);
            if (
    $this->ftp_connection)
                if (
    ftp_login($this->ftp_connection$this->ftp_user$this->ftp_pass))
                    
    $return true;
            return 
    $return;
        }

        function 
    ftp_is_dir($folder) {
            if (
    ftp_chdir($this->ftp_connection$folder)) {
                
    ftp_chdir($this->ftp_connection'..');
                return 
    true;
            } else {
                return 
    false;
            }
        }

        function 
    convert($size) {
            
    $unit = array('b''Kb''Mb''Gb''Tb''Pb''Eb''Zb''Yb');
            if (
    intval($size) != 0)
                
    $returned round($size/pow(1024, ($i floor(log($size1024)))), 2) . $unit[$i];
            else
                
    $returned "0".$unit[0];
            return 
    $returned;
        }

        function 
    get_local_size($file) {
            
    $stat stat($file);
            return 
    $stat[7];
        }

        function 
    create_list($folder='') {
            if (
    $this->ftp_connection) {
                
    $folder $this->ftp_folder.$folder;
                
    $files ftp_rawlist($this->ftp_connection$folder);
                foreach (
    $files as $ftp_files) {
                    
    $file_info    =    preg_split("/[\s]+/"$ftp_files9);
                    
    $ftp_files    =    $file_info[8];
                    
    $ftp_size    =    $file_info[4];
                    
    $this->count_size += $ftp_size;
                    if (
    $ftp_files != '.' and $ftp_files != '..' and !empty($ftp_files)) {
                        if (@
    $this->ftp_is_dir($folder.$ftp_files)) {
                            if (!
    is_dir($this->local_folder.$ftp_files)) {
                                
    mkdir($this->local_folder.$ftp_files);
                                
    chmod($this->local_folder.$ftp_files0777);
                            }
                            
    $this->create_list($folder.'/'.$ftp_files);
                        } else {
                            
    $file ereg_replace("^/"""$folder.'/'.$ftp_files);
                            if (!
    is_file($this->local_folder.$file) or $ftp_size != $this->get_local_size($this->local_folder.$file)) {
                                
    $this->file_list[$file] = $ftp_size;
                            } else {
                                echo 
    "файл <strong>".$file."</strong> размером <strong> ".$this->convert($ftp_size)."</strong> существует на сервере.<br />";
                            }
                        }
                    }
                }
            } else {
                echo 
    "error: not ftp connection.";
            }
        }

        function 
    create_lock_file() {
            
    $list '';
            foreach (
    $this->file_list as $file_name => $file_size) {
                if (!
    is_file($this->local_folder.$file_name) or $file_size != $this->get_local_size($this->local_folder.$file_name))
                    
    $list .= $file_name.':'.$file_size."\n";
            }
            
    $fp fopen($this->local_folder.'lock_file'"w+");
            
    fwrite($fp$list);
            
    fclose($fp);
        }

        function 
    update_lock_file() {
            
    $files file($this->local_folder.'lock_file');
            
    $this->file_list = array();
            foreach (
    $files as $file) {
                
    $file_info split(":"$file);
                
    $file_name $file_info[0];
                
    $file_size $file_info[1];
                if (!
    is_file($this->local_folder.$file_name) or $file_size != $this->get_local_size($this->local_folder.$file_name)) {
                    
    $this->file_list[$file_name] = $file_size;
                    
    $start_time $this->get_time();
                    if (
    $this->download_file($file_name$file_size)) {
                        
    $this->update_lock_file();
                        echo 
    "файл <strong>".$file_name."</strong> размером <strong>".$this->convert($file_size)."</strong> закачан на сервер за ".round($this->get_time() - $start_time3).".<br />";
                    }
                }
            }
        }

        function 
    delete_lock_file() {
            if (
    count($this->file_list) == 0) {
                
    unlink($this->local_folder.'lock_file');
            }
        }

        function 
    download_file($file_name$file_size) {
            
    $returned false;
            if (
    is_file($this->local_folder.$file_name))
                
    $local_size $this->get_local_size($this->local_folder.$file_name);
            
    $this->count_size_total += $file_size $local_size;
            if (
    $local_size != $file_size) {
                
    $download ftp_nb_get($this->ftp_connection$this->local_folder.$file_name$file_nameFTP_BINARY$local_size);
                while (
    $download == FTP_MOREDATA) {
                    
    $download ftp_nb_continue($this->ftp_connection);
                }
                if (
    $download == FTP_FINISHED) {
                    
    $returned true;
                }
            }
            return 
    $returned;
        }
    }
    ?> 
    При выполнении отображает чистую страничку. Данные не копируются.
    Помогите запустить.
    Задача состоит в автоматическом копировании папки по FTP с одного сервера на другой.
    Спасибо.
     
  2. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    PHP:
    ini_set('display_errors'1);
    ini_set('display_startup_errors'1);
    error_reporting(E_ALL); 

    Пропиши это в начале скрипта.
     
    Yuryus нравится это.
  3. Yuryus

    Yuryus

    Регистр.:
    3 апр 2007
    Сообщения:
    383
    Симпатии:
    145
    Спасибо
    Вот, что получаю.
    Код:
    Fatal error: Cannot instantiate non-existent class: ftp_download in /acentr/upd/cp.php on line 7
    
    Строка
    PHP:
    $ftp = new ftp_download();
    Вероятно не правильно подключаю класс.
    Помогите пожалуйста.
    Спасибо.
     
  4. swer

    swer

    Регистр.:
    15 июн 2008
    Сообщения:
    308
    Симпатии:
    38
    не найден класс.
    А ты подключил файл класса?
    PHP:
    include "class.ftp.php";//что то такого рода
     
  5. Yuryus

    Yuryus

    Регистр.:
    3 апр 2007
    Сообщения:
    383
    Симпатии:
    145
    Спасибо.
    Инклудить тоже пробовал
    PHP:
    <?php
    ini_set
    ('display_errors'1);
    ini_set('display_startup_errors'1);
    error_reporting(E_ALL);  

    set_time_limit(0);
    include 
    "ftp_download.php";
    $ftp = new ftp_download();
    $ftp->ftp_init('ftp_host''ftp_user''ftp_pass''local_folder''ftp_folder');
    echo 
    "Общее время загрузки: ".$ftp->count_time."<br />";
    echo 
    "Общий объем файлов: ".$ftp->count_size."<br />";
    echo 
    "Файлов загружено: ".$ftp->count_size_total."<br />";
    ?>
    Выдает
    Хотя в переменных указываю и сервер и папки для копирования.
    На удаленном сервере для папки установил права 777.
    Возможно скрипт не работоспособный.
    Спасибо.
     
  6. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Скрипт полностью работоспособен. Если показало такую ошибку, значит вы неверно указали локальную папку. Попробуйте указывать абсолютный путь, вместо относительного, например.
     
Статус темы:
Закрыта.