|
|
|
| Задача- перенести папку со всеми вложенными с одного сервера на другой. Я тут нашел код.... Все коменты исправил на русские и начал тестить. В процессе теста выявил две проблемы:
проблема 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, $fil, FTP_BINARY);
}
else
{
// Это папка. Пойдем по ней гулять
if ($fil == "bugaga")
{
//Это папка которую я не хочу заливать. она будет игнорироваться
}
else
{
ftpRec ($srcrela.$fil."/");
chdir ("../");
}
}
}
}
closedir($handle);
}
}
?>
|
| |
|
|
|
|
|
|
|
для: 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, $fil, FTP_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 . '/' . $fil, FTP_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";
?>
|
| |
|
|
|