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
File backup using php
提问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,
这是一个简单的类,它基本上使用,
- PHP 5 >= 5.2.0 ZipArchiveclass - For zipping.
- PHP 5 RecursiveIteratorIteratorclass - For recursively scanning the path.
- PHP 5 >= 5.2.0 ZipArchive类 - 用于压缩。
- PHP 5 RecursiveIteratorIterator类 - 用于递归扫描路径。
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