After writing WordPress – Backup & Restore I came across a site that I do not have SSH/CLI access to so I needed to have another option. If you have SSH/CLI access it’s best to use the process on WordPress – Backup & Restore.
Sometimes you just need a quick and dirty way to backup the WordPress site that you’ve taken over, this will help with that.
It will read the database settings from the wp-config.php file and then do a MySQL backup and a full site file backup.
Full disclosure I merged the two references together into one file to make this work. I did make minor changes but most of the credit goes to the two links below.
Make sure the OUTPUT_DIR variable is not within your web folder as someone could download your backups.
Note: At this time there isn’t any security around this file so it’s best to create the file, get the backups done and then remove the file.
<?php
// Report all errors
error_reporting(E_ALL);
$start_time = array_sum(explode(chr(32), microtime()));
$path = getenv('PWD');
if ($path == "/")
{
$path = $_SERVER['DOCUMENT_ROOT'];
}
require($path.'/wp-config.php');
//echo $path . "<br/>";
//echo "DB_HOST :".DB_HOST. "<br/>";
//echo "DB_USER :".DB_USER. "<br/>";
$dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if ( !$dbc ) {
die( 'Not Connected: ' . mysql_error());
}
else
{
echo "MySQL DB Connected<br/>";
}
define("OUTPUT_DIR", '/var/www/backup'); // Make sure you define a valid directory
define("TABLES", '*'); // By default we want all tables
// MySQL Backup - Start
$backupDatabase = new Backup_Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$status = $backupDatabase->backupTables(TABLES, OUTPUT_DIR) ? 'OK' : 'KO';
echo "MySQL Backup result: ".$status . "<br/>";
// MySQL Backup - Stop
// File Backup - Start
function filesize_recursive($path)
{
$ret = 0;
try
{
if(!file_exists($path)) return 0;
if(is_file($path)) return filesize($path);
foreach(glob($path."/*") as $fn)
$ret += filesize_recursive($fn);
}
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
return $ret;
}
if (filesize_recursive('/var/www/html') < 4080218931) // If directory size is less than 3.8 GB (4080218931 Bytes) Zip will be used, otherwise use Tar
{
echo "Zip Compression Selected";
$zip = new zipConverter();
$zip->setRecursiveness(true); //default is false
$zip->addFolder(
array(
'/var/www/html' // WordPress Site Directory Path, make sure you define the proper path
)
);
$zip->setZipPath(OUTPUT_DIR . '/site-backup-'.date('m-d-Y_hisa').'.zip'); //Set your Zip Path with your Zip File's Name
$result = $zip->createArchive();
if ($result["success"]==true)
{
$backupresult= "OK";
}
else
{
$backupresult= "Failed";
}
echo "<br/>File Backup result: " . $backupresult . "<br/>Files In Backup: " . $result["statistics"]["Num Files"];
}
else
{
echo "Tar Compression Selected<pre>";
if(system("tar -czvf /var/www/backup/site-backup-".date('m-d-Y_hisa').".tar.gz /var/www/html/"))
{
echo '</pre><b>Directory compressed successfully!</b>';
}
else
{
echo '</pre><b>Unable To Tar</b>';
}
}
// File Backup - Stop
$finish_time = array_sum(explode(chr(32), microtime()));
printf("<p>The time taken: %f seconds</p>", ($finish_time - $start_time));
class Backup_Database {
/**
* Host where database is located
*/
var $host = '';
/**
* Username used to connect to database
*/
var $username = '';
/**
* Password used to connect to database
*/
var $passwd = '';
/**
* Database to backup
*/
var $dbName = '';
/**
* Database charset
*/
var $charset = '';
/**
* Constructor initializes database
*/
function Backup_Database($host, $username, $passwd, $dbName, $charset = 'utf8')
{
$this->host = $host;
$this->username = $username;
$this->passwd = $passwd;
$this->dbName = $dbName;
$this->charset = $charset;
$this->initializeDatabase();
}
protected function initializeDatabase()
{
$conn = mysql_connect($this->host, $this->username, $this->passwd);
mysql_select_db($this->dbName, $conn);
if (! mysql_set_charset ($this->charset, $conn))
{
mysql_query('SET NAMES '.$this->charset);
}
}
/**
* Backup the whole database or just some tables
* Use '*' for whole database or 'table1 table2 table3...'
* @param string $tables
*/
public function backupTables($tables = '*', $outputDir = '.')
{
try
{
/**
* Tables to export
*/
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
$sql = 'CREATE DATABASE IF NOT EXISTS '.$this->dbName.";\n\n";
$sql .= 'USE '.$this->dbName.";\n\n";
/**
* Iterate tables
*/
foreach($tables as $table)
{
echo " Backing up ".$table." table...";
$result = mysql_query('SELECT * FROM '.$table);
$numFields = mysql_num_fields($result);
$sql .= 'DROP TABLE IF EXISTS '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$sql.= "\n\n".$row2[1].";\n\n";
for ($i = 0; $i < $numFields; $i++)
{
while($row = mysql_fetch_row($result))
{
$sql .= 'INSERT INTO '.$table.' VALUES(';
for($j=0; $j<$numFields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j]))
{
$sql .= '"'.$row[$j].'"' ;
}
else
{
$sql.= '""';
}
if ($j < ($numFields-1))
{
$sql .= ',';
}
}
$sql.= ");\n";
}
}
$sql.="\n\n\n";
echo " OK" . "<br/>";
}
}
catch (Exception $e)
{
var_dump($e->getMessage());
return false;
}
return $this->saveFile($sql, $outputDir);
}
/**
* Save SQL to file
* @param string $sql
*/
protected function saveFile(&$sql, $outputDir = '.')
{
if (!$sql) return false;
try
{
date_default_timezone_set("EST");
//echo "<br/>".date("m-d-Y_hisa", time())."<br/>";
$handle = fopen($outputDir.'/db-backup-'.$this->dbName.'-'.date("m-d-Y_hisa", time()).'.sql','w+');
fwrite($handle, $sql);
fclose($handle);
}
catch (Exception $e)
{
var_dump($e->getMessage());
return false;
}
return true;
}
}
class zipConverter
{
private $_isRecursive = false;
private $_folderList = array();
private $_zipPath = '';
private $_zip;
/**
* Class Constructor
*/
function __construct() {
$this->_zip = new ZipArchive();
}
/**
* Sets Recursive Behaviour in a folder
*
* @param boolean $isRecursive Indicates if folders will be scaned recursively or not
*
* @return void
*/
function setRecursiveness($isRecursive)
{
$this->_isRecursive = $isRecursive;
}
/**
* Adds folder to be included into the Zip Archive
*
* @param array $folderList Array of Folder Paths
*
* @return void
*/
function addFolder(array $folderList)
{
$this->_folderList = array_merge($this->_folderList, $folderList);
}
/**
* Sets Zip file Name with its Path
*
* @param string $path Path of the zip with its name
*
* @return array
*/
function setZipPath($path)
{
if ($this->_zip->open($path, ZipArchive::CREATE)!==TRUE) {
return array("error"=>true, "msg"=>"Can not open or create <$path>");
} else {
$this->_zipPath = $path;
return array("success"=>true);
}
}
/**
* Creates Zip Archive from your Provided Folders
*
* @return array
*/
function createArchive()
{
if (count($this->_folderList) == 0) {
return array("error"=>true, "msg"=>"You did not set Folder(s) which needs to be added into Zip Archive");
}
if ($this->_zipPath == '') {
return array("error"=>true, "msg"=>"Please set Zip Path first before Conversion process.");
}
ini_set('memory_limit', '-1');
foreach ($this->_folderList as $folder) {
$parent = substr($folder, (strlen(dirname($folder))+1)-strlen($folder));
if ($parent==$folder) {
$parent = '';
} else {
$this->_zip->addEmptyDir($parent);
}
$result = $this->_scanDir($folder, $parent);
if (is_array($result) && isset($result['error'])) {
return $result;
}
}
$msg["Num Files"] = $this->_zip->numFiles;
$this->_zip->close();
return array("success"=>true, "statistics"=>$msg);
}
/**
* Scans Folder Recursively
*
* @param string $dir Directory to be Scaned
* @param string $parentDir Parent Directory
*
* @return array | boolean
*/
private function _scanDir($dir, $parentDir='')
{
$cdir = array_diff(scandir($dir), array('..', '.'));
foreach ($cdir as $key => $value) {
if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
if ($this->_isRecursive) {
if ($parentDir=='') {
$newDir = $value;
} else {
$newDir = $parentDir. DIRECTORY_SEPARATOR . $value;
}
if($this->_zip->addEmptyDir($newDir)) {
$this->_scanDir($dir . DIRECTORY_SEPARATOR . $value, $newDir);
} else {
$this->_zip->close();
return array(
"error"=>true,
"msg"=>"Could not create <$parentDir". DIRECTORY_SEPARATOR . "$value> folder in Zip Archive."
);
}
}
} elseif (is_file($dir . DIRECTORY_SEPARATOR . $value)) {
if ($parentDir=='') {
$newDir = $value;
$newName = '';
} else {
$newDir = $dir. DIRECTORY_SEPARATOR . $value;
$newName = $parentDir. DIRECTORY_SEPARATOR . $value;
}
$result = $this->_zip->addFile($newDir, $newName);
}
}
return true;
}
}
?>
References:
http://www.azanweb.com/en/using-php-to-backup-mysql-databases/
http://www.phpclasses.org/package/8998-PHP-Create-ZIP-archive-with-the-files-of-a-directory.html
Last Updated on February 23, 2016