使用PHP压缩一个文件夹中的文件

17

我正在创建一个PHP备份脚本,将从数据库中转储所有内容并保存到文件中。我已经成功完成了这个过程,但现在我需要将一个目录中的数百张图像压缩成一个简单的.tar.gz文件。

最好的方法是什么?如何实现?我不知道从哪里开始。

先感谢您的帮助。


这可以帮助您:http://codingbin.com/compressing-a-directory-of-files-with-php/ - Manoj Dhiman
7个回答

16
如果您使用的是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";
}

1
感谢Kev的回答。我只需要澄清一件小事:您是想问我是否有低于5.2或高于5.2的PHP版本。我目前使用的是5.2.6。根据我理解您的回答,因为我的PHP版本太高,所以我将无法运行它。这正确吗? - VinkoCM
2
谢谢大家的帮助。我终于让脚本正常工作了。我所要做的就是将这一行代码进行修改:$zip->addFile($file); 修改为 $zip->addFile('path/to/images/'.$file); - VinkoCM
@VinkoCM,感谢您上次的评论,那正是我遇到的问题。或许答案可以进行更新。 - dajoto
1
应该将 if ($handle = opendir($images)) 改为 if ($handle = opendir($images_dir)) 吗? - johnsnails
显示文件名和zip文件名,状态为0。那么如何解决呢?它没有生成zip文件@David - Giridhari Lal
显示剩余10条评论

14
$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

这段代码是否在禁用函数execsystemshell_exec等的服务器上运行? - AmirHussein

1

我有一个简单的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
所选答案不支持递归(子目录),因此请看:
<?
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();
}

0
从@Martin Zvarík的回答。我有一个小改变!这将帮助我们将所有文件(以及子文件夹中的所有文件)压缩成一个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

您可以使用以下命令轻松地对文件夹进行gzip压缩:

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

这个命令可以通过php的system()函数运行。

不要忘记对所有命令进行escapeshellarg()转义处理。


谢谢你的回答,Alexander。这在PHP中会是什么样子呢?大概是这样的吗:system('tar -cvzpf my_backup.tar.gz /images_water/images_rivers/'); - VinkoCM
很不幸,这对我来说不起作用,因为我的托管提供商已经对exec/system命令设置了安全限制。 - VinkoCM
这是非常非常糟糕的解决方案。运行它将产生一个新进程,这是一种很大的浪费。 - Tebe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接