用PHP压缩文件目录

用PHP压缩文件目录,php,compression,backup,Php,Compression,Backup,我正在创建一个php备份脚本,它将转储数据库中的所有内容并将其保存到文件中。我已经成功地做到了这一点,但现在我需要在一个目录中获取数百个图像,并将它们压缩到一个简单的.tar.gz文件中 最好的方法是什么?如何做到?我不知道从哪里开始 提前感谢您可以使用以下命令轻松地gzip文件夹: tar -cvzpf backup.tar.gz /path/to/folder 此命令可以通过phps system()函数运行 不要忘记转义所有命令。如果您使用的是PHP5.2或更高版本,您可以使用 然后按照

我正在创建一个php备份脚本,它将转储数据库中的所有内容并将其保存到文件中。我已经成功地做到了这一点,但现在我需要在一个目录中获取数百个图像,并将它们压缩到一个简单的.tar.gz文件中

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


提前感谢

您可以使用以下命令轻松地gzip文件夹:

tar -cvzpf backup.tar.gz /path/to/folder
此命令可以通过phps system()函数运行


不要忘记转义所有命令。

如果您使用的是PHP5.2或更高版本,您可以使用

然后按照以下思路做一些事情:

$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";
}
$images_dir='/path/to/images';
//此文件夹必须可由服务器写入
$backup='/path/to/backup';
$zip_file=$backup'/backup.zip';
如果($handle=opendir($images\u dir))
{
$zip=新的ZipArchive();
如果($zip->open($zip_文件,ZipArchive::CREATE)!==TRUE)
{
退出(“无法打开”);
}
while(false!=($file=readdir($handle)))
{
$zip->addFile($images_dir.'/'.$file);
回显“$file\n”;
}
closedir($handle);
回显“numfiles:”.$zip->numfiles.\n”;
回显“状态:”..zip->status.“\n”;
$zip->close();
回显“Zip文件:”.$Zip\u文件。“\n”;
}

您也可以使用类似以下内容:

exec('tar -czf backup.tar.gz /path/to/dir-to-be-backed-up/'); exec('tar-czf backup.tar.gz/path/to/dir to backup/');
请务必了解如何使用PHP的
exec()
函数。

我的简单两行PHP文件,通过它我可以在几秒钟内创建备份ZIP文件:

$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
只需浏览:


只需将此文件上载到服务器并直接浏览即可

注:

  • 'mydirectory'==>相对于此PHP脚本的目标目录
  • 'my backup.tar.gz'==>将在上载此PHP文件的同一目录中创建
选择的答案不支持递归(子目录),因此您可以这样做:

<?
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();
}

来自@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();
}
echo$main\u path=str\u replace(“\\”、“/”、\uuuuu DIR\uuuuuuuuuuuuuuuuu);//获取当前文件夹,该文件夹称为scipt
$zip_file='myapp.zip';
如果(文件存在($main_路径)&&is_目录($main_路径))
{
$zip=新的ZipArchive();
如果(文件存在($zip文件)){
取消链接($zip_文件);//截断zip
}
如果($zip->open($zip_文件,ZIPARCHIVE::CREATE)!==TRUE){
模具(“无法打开”);
}
$files=0;
$path=数组($main_path);
while(list(,$path)=每个($path))
{
foreach(全局($path./*')作为$p)
{
if(is_dir($p)){
$path[]=$p;
}否则{
//这里的特别之处:我们删除根文件夹(“D:\xampp\htdocs\myapp\”):D
$new\u filename=str\u replace($main\u path.“/”,“”,$p);
$zip->addFile($p,$new\u文件名);
$files++;
echo$p.“
\n”; } } } 回显“总文件数:”.$files; $zip->close(); }
谢谢Kev的回答。我只需要澄清一点:你是想问我的PHP版本是低于5.2还是高于5.2。我现在有5.2.6。正如我理解你的答案,我将无法运行这个,因为我有一个PHP版本高。这是正确的吗?他的意思是你需要一个5.2.0或更高版本的PHP,所以你会没事的。是的,很抱歉Alexander说是5.2.0或更高版本的。谢谢大家的帮助。我终于开始写剧本了。我所要做的就是更改这行:$zip->addFile($file);对此:$zip->addFile('path/to/images/'。$file);如果($handle=opendir($images))
应该是
if($handle=opendir($images\u dir))
?谢谢你的回答。这在php中是什么样子?它是否会遵循以下思路:系统('tar-cvzpf my_backup.tar.gz/images_water/images_rivers/');不幸的是,这对我不起作用,因为我的主机提供商对exec/system命令设置了安全限制。这是一个非常糟糕的解决方案。运行它将产生一个新的进程,这是一个巨大的浪费。这段代码是在禁用了功能的服务器上运行的吗?
exec
system
shell\u exec
?这可以帮助您
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();
}