Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа с фтп протоколом
 
 автор: icqheart   (12.09.2008 в 21:53)   письмо автору
 
 

Задача- перенести папку со всеми вложенными с одного сервера на другой. Я тут нашел код.... Все коменты исправил на русские и начал тестить. В процессе теста выявил две проблемы:

проблема 1. функция ftp_put на одном из моих хостингов не работает. => Можно ли как-то написать скрипт чтобы он не пользовался этой функцией, а пользовался бы какой-нибудь другой, которая доступна везде?

проблема 2. я тестил скрипт на локальной машине, на денвере. Когда попробовал запустить с сервера в инете- он не стал работать. Может быть он вообще способен работать только с локальной машины? Подскажите, как быть

Привожу сам листинг:

<?php
    
// Устанавливаем значения переменных
    
$ftproot "/mysite.ru/www/";
    
$srcroot "/home/test1.ru/www/wpblogger/";        
    
$srcrela "test2/";

    
// Устанавливаем соединение по FTP  пробуем логиниться
    
$ftpc ftp_connect("ftp.mysite.ru");
    
$ftpr ftp_login($ftpc,"login","password");

    if ((!
$ftpc) || (!$ftpr)) { echo "FTP соединение не установлено!"; die(); }
    if (!
chdir($srcroot)) { echo "Не могу получить доступ в исходную директорию"; die(); }
    if (!
ftp_chdir($ftpc,$ftproot)) { echo "Не получается получить доступ в удаленную папку"; die(); }

    
// Запускаем функцию, приведенную ниже
    
ftpRec ($srcrela);

    
// Закрываем FTP соединение
    
ftp_close($ftpc);

// --------------------------------------------------------------------
// ФУНКЦИЯ
// --------------------------------------------------------------------
function ftpRec ($srcrela)
{
    global 
$srcroot;
    global 
$ftproot;
    global 
$ftpc;
    global 
$ftpr;
                
    
// входим в локальную папку, которую будем листить
    
chdir($srcroot.$srcrela);
    
    
// check if the directory exists & change to it on the destination
    
if (!ftp_chdir($ftpc,$ftproot.$srcrela))
    {
        
// Удаленной директории не существует. Создадим ее и войдем в нее
           
ftp_mkdir    ($ftpc,$ftproot.$srcrela);
           
ftp_chdir    ($ftpc,$ftproot.$srcrela);
    }

    if (
$handle opendir("."))
    {
       while (
false !== ($fil readdir($handle)))
       {
           if (
$fil != "." && $fil != "..")    
           {
               
// Проверяем, папка или файл нам попалась
               
if (!is_dir($fil))
               {    
                   
// Это файл. Значит, его надо залить
                   
ftp_put($ftpc$ftproot.$srcrela.$fil$filFTP_BINARY);
                   
                }
                else
                {
                    
// Это папка. Пойдем по ней гулять
                    
if ($fil == "bugaga")
                    {
                            
//Это папка которую я не хочу заливать. она будет игнорироваться
                    
}
                    else
                    {
                        
ftpRec ($srcrela.$fil."/");
                        
chdir ("../");
                    }
                }
          }
      }
      
closedir($handle);
    }    
}
?>

  Ответить  
 
 автор: xx77   (13.09.2008 в 13:41)   письмо автору
 
   для: icqheart   (12.09.2008 в 21:53)
 

как Вы определили что ftp_put не работает?

возможно ftp_put() работает, попробуйте поставить побольше вывода информации о работе функции.
например так:

<?
    chdir
('.') OR exit('нет доступа в локальную дирректорию');

    
$ftproot "/mysite.ru/www/";      
    
$srcrela "test2/"
    
    
// соединение по FTP
    
$ftpc ftp_connect("ftp.mysite.ru") OR exit("FTP соединение не установлено!");
    
$ftpr ftp_login($ftpc,"login","password") OR exit("FTP соединение не установлено!");
// ftp_pasv($ftpc , true);

 
if (!ftp_chdir($ftpc,$ftproot)) exit("Не получается получить доступ в удаленную папку");
    else echo 
ftp_pwd($ftpc)
    . 
' - текущая дирректория<br/><br/>'"\n";

   
// Запускаем функцию, приведенную ниже
    
ftpRec ($srcrela);
    
// Закрываем FTP соединение
    
ftp_close($ftpc);

function 
ftpRec ($srcrela)
{
    global 
$ftproot$ftpc;

// проверка существования & вход
    
if (!@ftp_chdir($ftpc$ftproot $srcrela))
    {
        
// Удаленной директории не существует
         
if (  !ftp_mkdir$ftpc$ftproot $srcrela )
         && !
ftp_chdir($ftpc$ftproot $srcrela)
         )  exit(
"Не получается создать и получить доступ в папку"); 
    }
echo ( 
$dir ftp_pwd($ftpc))
    . 
' - текущая дирректория<br/><br/>'"\n";    
 if (
$dir !== $ftproot $srcrela) exit('Здесь замечен баг
 как-будто
 переход в дирректорию произошёл но текущая дирректория не изменилась
 или она изменилась , но $dir != $ftproot . $srcrela
 <hr/><hr/>'
);
 
    
$handle opendir($srcrela) OR exit('Не получается открыть локальную папку');
    while (
$fil readdir($handle))
    {
        if (
is_file($fil))
        {
        echo 
'файл ' $srcrela $fil ;
            
// Это файл. Значит, его надо залить 
            
if (!ftp_put($ftpc$fil$filFTP_BINARY)) 
                echo 
" не создан<hr/>\n";
            else echo 
" создан<br/>\n";
        }
        else if (
$fil != "." && $fil != ".." && $fil != "bugaga")     
        {
        echo 
'папка ' $srcrela $fil ."<br/>\n";
            
ftpRec ($srcrela $fil "/"); 
        }
    
flush();
    }
    
closedir($handle);
}
###############
echo '<hr/><hr/> готово' "\n";
?>


но IMHO все эти ftp_chdir() ненадёжная штука, или я не правильно ими пользуюсь .
помоему проще и надёжнее с ftp-сервером использовать абсолютные пути

<?php
 $ftpdir 
"/mysite.ru/www/test2";      
    
$srcdir "./test2"
    
    
// соединение по FTP
    
$ftpc ftp_connect("ftp.mysite.ru") OR exit("FTP соединение не установлено!");
    
$ftpr ftp_login($ftpc,"login","password") OR exit("FTP соединение не установлено!");
// ftp_pasv($ftpc , true);

ftpRec$ftpdir,  $srcdir );// функцию приведенную ниже    
ftp_close$ftpc ); // 

function ftpRec ($ftpdir,  $srcdir)
{
    global 
$ftpc;

// проверка существования & вход
    
if (!@ftp_chdir($ftpc$ftpdir))
    {
        
// Удаленной директории не существует
         
if (  !ftp_mkdir$ftpc$ftpdir )
         && !
ftp_chdir($ftpc$ftpdir)
         )  exit(
"Не получается создать и получить доступ в папку"); 
    } else echo 
'папка существовала<br/>' "\n";

    
$handle opendir($srcdir) OR exit('Не получается открыть локальную папку');
    while (
$fil readdir($handle))
    {
        if (
is_file($srcdir '/' $fil))
        {
        echo 
'файл ' $ftpdir '/' $fil ;
            
// Это файл. Значит, его надо залить 
            
if (!ftp_put($ftpc$ftpdir '/' $fil$srcdir '/' $filFTP_BINARY)) 
                echo 
" не создан<hr/>\n";
            else echo 
" создан<br/>\n";
        }
        else if (
$fil != "." && $fil != ".." && $fil != "bugaga")     
        {
        echo 
'папка ' $ftpdir '/' $fil ."<br/>\n";
            
ftpRec ($ftpdir '/' $fil$srcdir '/' $fil); 
        }
    
flush();
    }
    
closedir($handle);
}
###############
echo '<hr/><hr/> готово' "\n";
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования