Как заархивировать текущий каталог root, исключая файл и каталог с PHP - PullRequest
0 голосов
/ 26 февраля 2020

Мне нужно выполнить задание резервного копирования перед обновлением моего приложения PHP. Я пытаюсь найти эквивалент этой команды в linux, но с использованием PHP.

zip -r tmp/1.01b.zip * -x tmp/**\* config/config.php

Я немного посмотрел на класс ZipArchive, встроенный в php -zip, но у меня возникли трудности с исключениями и рекурсией. Я впервые использую этот класс.

Следуя аккуратному сценарию, найденному по адресу:

Вот где я был: { ссылка }

public function backup(){
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('tmp/'), RecursiveIteratorIterator::SELF_FIRST);
    $exclusions = [];
    foreach ($files as $file){
        array_push($exclusions,$file);
    }
    array_push($exclusions,'config/config.php');
    array_push($exclusions,'tmp/backup-'.$this->site['version'].'.zip');
    $this->Zip('/','tmp/backup-'.$this->site['version'].'.zip', false, $exclusions);
}

public function Zip($source, $destination, $include_dir = false, $exclusions = false){
    // Remove existing archive
    if (file_exists($destination)) {
        unlink ($destination);
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }
    $source = str_replace('\\', '/', realpath($source));
    if (is_dir($source) === true){
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
        if ($include_dir) {
            $arr = explode("/",$source);
            $maindir = $arr[count($arr)- 1];
            $source = "";
            for ($i=0; $i < count($arr) - 1; $i++) {
                $source .= '/' . $arr[$i];
            }
            $source = substr($source, 1);
            $zip->addEmptyDir($maindir);
        }
        foreach ($files as $file){
            // Ignore "." and ".." folders
            $file = str_replace('\\', '/', $file);
            if(in_array(substr($file, strrpos($file, '/')+1), array('.', '..'))){
                continue;
            }

            // Add Exclusion
            if(($exclusions)&&(is_array($exclusions))){
                if(in_array(str_replace($source.'/', '', $file), $exclusions)){
                    continue;
                }
            }

            $file = realpath($file);
            if (is_dir($file) === true){
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            } elseif (is_file($file) === true){
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    } elseif (is_file($source) === true){
        $zip->addFromString(basename($source), file_get_contents($source));
    }
    return $zip->close();
}

Но теперь, когда я запускаю скрипт, он, кажется, работает бесконечно. Я думаю, что он пытается архивировать себя. Но я не уверен, как это проверить или предотвратить.

1 Ответ

0 голосов
/ 26 февраля 2020

Нашел мою проблему. Поскольку я хотел сделать резервную копию текущего каталога приложения, я пытался использовать «/» в качестве исходного каталога, в то время как я должен был использовать «.».

public function backup(){
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('tmp/'), RecursiveIteratorIterator::SELF_FIRST);
    $exclusions = [];
    foreach ($files as $file){
        array_push($exclusions,$file);
    }
    array_push($exclusions,'config/config.php');
    array_push($exclusions,'tmp/backup-'.$this->site['version'].'.zip');
    $this->Zip('.','tmp/backup-'.$this->site['version'].'.zip', false, $exclusions);
}
...