php 使用php进行文件备份

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5556256/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 21:48:01  来源:igfitidea点击:

File backup using php

phpbackup

提问by Vish

I want to use php to create a snapshot of all the files in a given folder and then zip it.

我想使用 php 创建给定文件夹中所有文件的快照,然后对其进行压缩。

How can I do that. Is zipping a built in function to php. Also are there any alternatives to compressing.

我怎样才能做到这一点。正在将内置函数压缩到 php.ini 中。还有其他压缩方法吗?

What sort of file backup system do you have in place for your code. I am doing this for an open source application, so it is not backing up my particular system, so it has to be purely in PHP as people won't always know how to install certain applications.

您为您的代码准备了什么样的文件备份系统。我正在为一个开源应用程序执行此操作,因此它不备份我的特定系统,因此它必须完全使用 PHP,因为人们并不总是知道如何安装某些应用程序。

Thanks guys.

谢谢你们。

回答by Lawrence Cherone

Already answered - PHP Recursive Backup Script

已经回答 - PHP 递归备份脚本

Edit

编辑

To add to an old, and extremely poor original answer...

添加到一个旧的,非常糟糕的原始答案......

Here is a simple class which basically uses,

这是一个简单的类,它基本上使用,

Usage:You simply pass the project path as a construct parameter. It will recursively zip and store the project in a folder called ./project_backups/, you can optionally set a second construct parameter to just send the file as a download. Something a little different from the other answers.

用法:您只需将项目路径作为构造参数传递。它将递归压缩并将项目存储在名为 的文件夹中./project_backups/,您可以选择设置第二个构造参数以将文件作为下载发送。与其他答案有些不同。

<?php
//Example Usage/s
$backup = new BackupMyProject('./path/to/project/yada');

print_r($backup);
/*
Then your have the object properties to determine the backup

$backup = BackupMyProject Object
(
    [project_path] => ./path/to/project/yada
    [backup_file] => ./project_backups/yada.zip
)

Alternatively set the second parameter and just send the project as a download.
BackupMyProject('./path/to/project/yada', true);
*/


/**
 * Zip a directory into a backups folder, 
 *  optional send the zip as a download
 * 
 * @author Lawrence Cherone
 * @version 0.1
 */
class BackupMyProject{
    // project files working directory - automatically created
    const PWD = "./project_backups/";

    /**
     * Class construct.
     *
     * @param string $path
     * @param bool $download
     */
    function __construct($path=null, $download=false){
        // check construct argument
        if(!$path) die(__CLASS__.' Error: Missing construct param: $path');
        if(!file_exists($path)) die(__CLASS__.' Error: Path not found: '.htmlentities($path));
        if(!is_readable($path)) die(__CLASS__.' Error: Path not readable: '.htmlentities($path));

        // set working vars
        $this->project_path = rtrim($path, '/');
        $this->backup_file  = self::PWD.basename($this->project_path).'.zip';

        // make project backup folder
        if(!file_exists(self::PWD)){
            mkdir(self::PWD, 0775, true);
        }

        // zip project files
        try{
            $this->zipcreate($this->project_path, $this->backup_file);
        }catch(Exception $e){
            die($e->getMessage());
        }

        if($download !== false){
            // send zip to user
            header('Content-Description: File Transfer');
            header('Content-Type: application/zip');
            header('Content-Disposition: attachment; filename="'.basename($this->backup_file).'"');
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            header('Content-Length: '.sprintf("%u", filesize($this->backup_file)));
            readfile($this->backup_file);
            // cleanup
            unlink($this->backup_file);
        }
    }

    /**
     * Create zip from extracted/fixed project.
     *
     * @uses ZipArchive
     * @uses RecursiveIteratorIterator
     * @param string $source
     * @param string $destination
     * @return bool
     */
    function zipcreate($source, $destination) {
        if (!extension_loaded('zip') || !file_exists($source)) {
            throw new Exception(__CLASS__.' Fatal error: ZipArchive required to use BackupMyProject class');
        }
        $zip = new ZipArchive();
        if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
            throw new Exception(__CLASS__. ' Error: ZipArchive::open() failed to open path');
        }
        $source = str_replace('\', '/', realpath($source));
        if (is_dir($source) === true) {
            $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
            foreach ($files as $file) {
                $file = str_replace('\', '/', realpath($file));
                if (is_dir($file) === true) {
                    $zip->addEmptyDir(str_replace($source.'/', '', $file.'/'));
                } else if (is_file($file) === true) {
                    $zip->addFromString(str_replace($source.'/', '', $file), file_get_contents($file));
                }
            }
        }
        return $zip->close();
    }

}

回答by bitfox

If you have the privileges to execute commands. You can create a tar.gz files using the exec function. For example:

如果您有权限执行命令。您可以使用 exec 函数创建 tar.gz 文件。例如:

<?php 
   exec("tar -czf folder.tar.gz folder");
?>

回答by T.Todua

an easy way:

一个简单的方法:

<?php
$old1 = 'file.php';
$new1 = 'backup.php';
copy($old1, $new1) or die("Unable to backup");

echo 'Backup Complete. <a href="./index.php">Return to the Editor</a>';
?>

回答by Andi P. Trix

Here is a backup script with ftp, mysqldump and filesystem capabilities https://github.com/skywebro/php-backup

这是一个带有 ftp、mysqldump 和文件系统功能的备份脚本https://github.com/skywebro/php-backup