3

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

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

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.

Thanks guys.

Vish
  • 4,508
  • 10
  • 42
  • 74

4 Answers4

6

Already answered - PHP Recursive Backup Script

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.

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

}
Community
  • 1
  • 1
Lawrence Cherone
  • 46,049
  • 7
  • 62
  • 106
3

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

<?php 
   exec("tar -czf folder.tar.gz folder");
?>
bitfox
  • 2,281
  • 1
  • 18
  • 17
0

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>';
?>
T.Todua
  • 53,146
  • 19
  • 236
  • 237
0

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

Andi P. Trix
  • 175
  • 1
  • 3