Задать вопрос
@bossigorxxx

Как сжать в зип архив сайт?

Всем привет Нашел код сжатия сайта в архив НО почему то не архивирует папки сайта в корне. а только файлы. Что не так? код ниже:

<?php

$zip = new ZipArchive();
$filename = "myzipfile.zip";

if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
        exit("cannot open <$filename>\n");
}

$dir = './';

// Create zip
if (is_dir($dir)){

    if ($dh = opendir($dir)){
        while (($file = readdir($dh)) !== false){
                
            // If file
            if (is_file($dir.$file)) {
                if($file != '' && $file != '.' && $file != '..'){
                        
                    $zip->addFile($dir.$file);
                }
            }
                    
        }
        closedir($dh);
    }
}

$zip->close();

echo $filename;
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@alexalexes
Потому, что у вас в коде происходит обход только по текущему уровню каталога $dir.
Чтобы обход заныривал глубже, нужно создать рекурсивную функцию.
Телом рекурсивной функции у вас будет:
if ($dh = opendir($dir))
{
// код, который у вас в вопросе
}

А точка вызова для смены подкаталога:
if (is_file($dir.$file)) {
// код из вопроса
            }
else if(is_dir($dir.$file))
{
   $zip->addEmptyDir($dir.$file);
   // тут должен быть вызов рекурсивной функции, по которой вы передаете контекст $zip и $dir.$file (наверное, передача по ссылке)
}

В этом случае у вас будет рекурсивный обход каталогов в глубину.
PS: Проконтролируйте дескриптор $zip на больших вложенностях и большим содержании файлов, нет ли переполнения выделенной оперативной памяти. Еще стек вызовов функций не бесконечный, тоже проконтролируйте глубину вызова.
PPS: Бэкапить сайты в архив делается одной строчкой линуксовой командой, и засовывается в crontab. Будет работать надежнее. Эта не задачка для php-разработчика.
То, что вы делаете - это просто тренировка на кошках, как работать с ZipArchive в PHP.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@SunTechnik
Пттому что метод addFile добавляет файл к архиву, а не каталог. (да и у стандартного zip надо указывать, что хотим заходить в каталог)
Либо Вам надо самому писать обход подкаталогов, либо воспользоваться другим методом добавления файлов в архив, изучив документацию.
https://www.php.net/manual/en/class.ziparchive.php
Ответ написан
Комментировать
вменяемая поддержка хостера сразу вам предложит решение через назначенные задания и с корректным созданием архивов средствами *nix

не забывайте о возможности локальной работы с сайтом и зеркалированием результатов работы на сам сайт
Ответ написан
Комментировать
Afranius
@Afranius
Из говорящих дольше живут те, что говорят меньше.
День добрый. А сайт где расположен - у Вас или у хостера?
У вменяемых хостеров есть свои средства упаковки-распаковки.
У себя... я вообще не понимаю, зачем php-скриптом делать, если можно просто zip в командной строке использовать.

И ещё. Сайт обычно - это не только файлы и папки. Это ещё и база данных, к примеру.
Для неё нужно предварительно слить содержимое БД в файл, используя mysqldump например.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы