В этом материале будет описан принцип подключения через библиотеку ftp к сайту на удаленном сервере, затем очистка корня сайта от всех файлов и папок и загрузка нового архива сайта с автоматической авторазархивацией.
Принцип работы
Предположим у нас есть два сайта (на разных или одинаковых серверах): mainsss.ru и copysss.ru. У нас есть ftp доступ к сайту copysss.ru до его корня (т.е. внутри лежат файлы и папки этого сайта). Запустим скрипт с сайта mainsss.ru, который подключится по ftp к сайту copysss.ru и удалит из него index.html и index.php, а затем загрузит index.php и arhive.zip (с mainsss.ru). Далее при открытии в браузере copysss.ru, запустится скрипт index.php, который удалит этот файл и всю старую структуру сайта copysss.ru, а затем разархивирует новый сайт из arhive.zip. Таким образом, мы полностью перезагрузим содержимое сайта copysss.ru.
Создадим внутри mainsss.ru файл copy.php
Для работы нам понадобится подключить в этом файле методом include() класс по работе с ftp. Только в скачанном классе, внутрь Class FTPClient { } вставьте новый метод: public function listFileArr($directory) { $now_dir = ftp_nlist($this->connectionId, $directory); return $now_dir; }
Далее прописываем такой код в copy.php:
<?php
//FTP соединение успешно установлено
if($ftpObj->connect('ftp_host', 'ftp_username', 'ftp_userpassword')) {
$ftpObj->delFile('/index.html'); //удаляем индексные файлы, которые могут помешать в FTP
$ftpObj->delFile('/index.php'); //удаляем индексные файлы, которые могут помешать в FTP
//грузим index-й файл, который сможет удалить все содержимое корня выбранного сайта
$ftpObj->uploadFile('/index.php', $_SERVER['DOCUMENT_ROOT'].'/copy/index.php');
//загружаем архив сайта с текущего сервера на удаленный
$ftpObj->uploadFile('/arhive.zip', $_SERVER['DOCUMENT_ROOT'].'/copy/arhive.zip');
}
?>
Теперь создайте в copysss.ru папку copy и поместите туда архив с новым сайтом arhive.zip и файл index.php, содержимое которого должно быть следующим:
<?php
$dir = __DIR__; //путь от сервера к месту где исполняется этот скрипт, например: /var/www/u53453453/data/www/copysss.ru
function removeDirectory($dir) {
if ($objs = glob($dir."/*")) {
foreach($objs as $obj) {
if(is_dir($obj)) { removeDirectory($obj); } //если папка
else { //если файл
if($obj != __DIR__.'/index.php' && $obj != __DIR__.'/arhive.zip') unlink($obj); //файлы-исключения, которые не надо удалять
} } }
if($dir != __DIR__) rmdir($dir); //удаляем все папки, кроме той, откуда запущен скрипт
}
removeDirectory($dir);
//Разархивируем файлы архива
$zip = new ZipArchive;
if ($zip -> open(__DIR__.'/arhive.zip') === TRUE) {
//переименовываем файл управления и удаляем его
rename(__DIR__."/index.php", __DIR__."/index_delete.php");
unlink(__DIR__."/index_delete.php");
$zip -> extractTo(__DIR__);
$zip -> close(); }
else echo 'Ошибка при обращении к архиву. Возможно он поврежден или еще не загрузился!';
sleep('1');
echo '<script>window.location="/"</script>';
?>
После успешной перезаписи файлов ссылкой mainsss.ru/copy.php, если вы откроете copysss.ru, то запустится новый скрипт в index.php.
Здесь имеется защита от преждевременного обращения к сайту. Например, если архив еще не загрузился, мы не сможем его разархивировать. Для этого делается автообновление каждую секунду sleep('1'). Как только архив с новым сайтом загрузится, начнется его выгрузка в корень сайта.
Чтобы запретить прямое выполнение скрипта в исходном сайте по пути mainsss.ru/copy/index.php. Можете поставить условие с доменом вашего сайта: if($_SERVER['SERVER_NAME'] == 'mainsss.ru') die(); в начале кода.
Добавить комментарий