Я создаю сценарий резервного копирования php, который выгружает все из базы данных и сохраняет его в файл. Мне это удалось, но теперь мне нужно взять сотни изображений в каталог и сжать их в один простой файл .tar.gz.

Как лучше всего это сделать и как это сделать? Понятия не имею, с чего начать.

Заранее спасибо

17
VinkoCM 26 Июн 2009 в 16:12

7 ответов

Лучший ответ

Если вы используете PHP 5.2 или новее, вы можете использовать Zip Library

А затем сделайте что-нибудь вроде:

$images_dir = '/path/to/images';
//this folder must be writeable by the server
$backup = '/path/to/backup';
$zip_file = $backup.'/backup.zip';

if ($handle = opendir($images_dir))  
{
    $zip = new ZipArchive();

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

    while (false !== ($file = readdir($handle))) 
    {
        $zip->addFile($images_dir.'/'.$file);
        echo "$file\n";
    }
    closedir($handle);
    echo "numfiles: " . $zip->numFiles . "\n";
    echo "status:" . $zip->status . "\n";
    $zip->close();
    echo 'Zip File:'.$zip_file . "\n";
}
16
Ivailo Alexandrov 8 Окт 2018 в 11:18
$archive_name = 'path\to\archive\arch1.tar';
$dir_path = 'path\to\dir';

$archive = new PharData($archive_name);
$archive->buildFromDirectory($dir_path); // make path\to\archive\arch1.tar
$archive->compress(Phar::GZ); // make path\to\archive\arch1.tar.gz
unlink($archive_name); // deleting path\to\archive\arch1.tar
13
SergO 24 Янв 2014 в 09:34

Вы также можете использовать что-то вроде этого:

exec('tar -czf backup.tar.gz /path/to/dir-to-be-backed-up/');

Обязательно обратите внимание на предупреждения о с помощью функции PHP exec().

13
geerlingguy 7 Апр 2014 в 18:33

Мой простой 2-строчный файл PHP, с помощью которого я могу создать резервную копию ZIP-файла за несколько секунд:

Просто просмотрите: http://mysiteurl.com/create-my-zip.php

<?php
/* PHP FILE NAME: create-my-zip.php */

echo exec('tar zcf my-backup.tar.gz mydirectory/*');

echo '...Done...';

?>

Просто загрузите этот файл на сервер и просматривайте его напрямую.

Примечания:

  • 'mydirectory' ==> целевой каталог относительно этого скрипта PHP;
  • 'my-backup.tar.gz' ==> будет создан в том же каталоге, где загружен этот файл PHP;
1
Reza Mamun 7 Авг 2014 в 11:51

Вы можете легко сжать папку с помощью этой команды:

tar -cvzpf backup.tar.gz /path/to/folder

Эту команду можно запустить через функцию phps system ().

Не забудьте выполнить escapeeshellarg () для всех команд.

0
alexn 26 Июн 2009 в 12:14

От @Martin Zvarík anwser. У меня было небольшое изменение! Это поможет нам сжать весь файл (и все файлы в подпапке) в zip-файл, но не будет включать корень.

Пример: корневой путь

D:\xampp\htdocs\myapp\zip-this-folder.php
D:\xampp\htdocs\myapp\index.php
D:\xampp\htdocs\myapp\assets\...
D:\xampp\htdocs\myapp\js\..

При вызове: zip-this-folder.php выводится myapp.zip myapp.zip есть

- zip-this-folder.php
- index.php
- assets\...
- js\..

Zip-this-folder.php:

echo $main_path = str_replace("\\", "/", __DIR__ );// get current folder, which call scipt
$zip_file = 'myapp.zip';

if (file_exists($main_path) && is_dir($main_path))  
{
    $zip = new ZipArchive();

    if (file_exists($zip_file)) {
        unlink($zip_file); // truncate ZIP
    }
    if ($zip->open($zip_file, ZIPARCHIVE::CREATE)!==TRUE) {
        die("cannot open <$zip_file>\n");
    }

    $files = 0;
    $paths = array($main_path);
    while (list(, $path) = each($paths))
    {
        foreach (glob($path.'/*') as $p)
        {
            if (is_dir($p)) {
                $paths[] = $p;
            } else {
                // special here: we remove root folder ("D:\xampp\htdocs\myapp\") :D
                $new_filename = str_replace($main_path."/" , "", $p);
                $zip->addFile($p, $new_filename);
                $files++;

                echo $p."<br>\n";
            }
        }
    }

    echo 'Total files: '.$files;

    $zip->close();
}
0
Hoàng Vũ Tgtt 8 Июн 2021 в 05:04

Выбранный ответ не поддерживает рекурсию (подкаталоги), поэтому готово:

<?
ignore_user_abort(true);
set_time_limit(3600);


$main_path = 'folder2zip';
$zip_file = 'zipped.zip';

if (file_exists($main_path) && is_dir($main_path))  
{
    $zip = new ZipArchive();

    if (file_exists($zip_file)) {
        unlink($zip_file); // truncate ZIP
    }
    if ($zip->open($zip_file, ZIPARCHIVE::CREATE)!==TRUE) {
        die("cannot open <$zip_file>\n");
    }

    $files = 0;
    $paths = array($main_path);
    while (list(, $path) = each($paths))
    {
        foreach (glob($path.'/*') as $p)
        {
            if (is_dir($p)) {
                $paths[] = $p;
            } else {
                $zip->addFile($p);
                $files++;

                echo $p."<br>\n";
            }
        }
    }

    echo 'Total files: '.$files;

    $zip->close();
}
1
Martin Zvarík 8 Дек 2016 в 08:56