【问题标题】:Compressing a directory of files with PHP使用 PHP 压缩文件目录
【发布时间】:2009-06-26 12:12:34
【问题描述】:

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

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

提前致谢

【问题讨论】:

标签: php compression backup


【解决方案1】:

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

【讨论】:

  • 感谢 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);
  • 应该if ($handle = opendir($images))if ($handle = opendir($images_dir))
【解决方案2】:
$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

【讨论】:

    【解决方案3】:

    你也可以这样使用:

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

    关于使用PHP的exec()函数,请务必heed the warnings

    【讨论】:

    • 此代码是否在禁用功能的服务器上运行exec,system,shell_exec,...
    【解决方案4】:

    我的简单 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 文件上传的同一目录中创建;

    【讨论】:

      【解决方案5】:

      选择的答案不支持递归(子目录),所以你去吧:

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

      【讨论】:

        【解决方案6】:

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

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

        这个命令可以通过phps system()-function运行。

        不要忘记转义shellarg() 所有命令。

        【讨论】:

        • 谢谢亚历山大的回答。这在 php 中会是什么样子?会不会是这样的:system('tar -cvzpf my_backup.tar.gz /images_water/images_rivers/');
        • 很遗憾,这对我不起作用,因为我的托管服务提供商对 exec/system 命令设置了安全限制。
        • 这是非常非常糟糕的解决方案。运行它会承担一个新的进程,这是一个很大的浪费。
        【解决方案7】:

        来自@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();
        }
        

        【讨论】:

          猜你喜欢
          • 2014-10-23
          • 1970-01-01
          • 1970-01-01
          • 2015-12-26
          • 1970-01-01
          • 2013-07-09
          • 2018-03-28
          • 2012-12-22
          • 1970-01-01
          相关资源
          最近更新 更多