A Handy PHP Backup Script

I found a script over on the Lunarpages Forums about using PHP to back up your site. I have taken it, modified it a little, beefed up the documentation a lot, and am now posting it here. You can download the source code for it, and it is also displayed below.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
/**
 * Generic Backup Script.
 * 
 * To configure this script for your purposes, just edit the parameters below.
 * Once you have the parameters set properly, when the script executes, it will
 * create an archive file, gzip it, and e-mail it to the address specified.  It
 * can be executed through cron with the command
 * 
 * php -q [name of script]
 * 
 * You are free to use this, modify it, copy it, etc.  However, neither DJS
 * Consulting nor Daniel J. Summers assume any responsibility for good or bad
 * things that happen when modifications of this script are run.
 * 
 * @author Daniel J. Summers <daniel@djs-consulting.com>
 */
 
// --- SCRIPT PARAMETERS ---
 
/*  -- File Name --
	This is the name of the file that you're backing up, and should contain no
	slashes.  For example, if you're backing up a database, this might look
	something like...
$sFilename = "backup-my_database_name-" . date("Y-m-d") . ".sql"; */
$sFilename = "backup-[whatever-it-is]-" . date("Y-m-d") . ".[extension]";
 
/*  -- E-mail Address --
	This is the e-mail address to which the message will be sent. */
$sEmailAddress = "[your e-mail address]";
 
/*  -- E-mail Subject --
	This is the subject that will be on the e-mail you receive. */
$sEmailSubject = "[something meaningful]";
 
/*  -- E-mail Message --
	This is the text of the message that will be sent. */
$sMessage = "Compressed database backup file $sFilename.gz attached.";
 
/*  -- Backup Command --
	This is the command that does the work.
 
	A note on the database commands - your setup likely requires a password
	for these commands, and they each allow you to pass a password on the
	command line.  However, this is very insecure, as anyone who runs "ps" can
	see your password!  For MySQL, you can create a ~/.my.cnf file - it is
	detailed at http://dev.mysql.com/doc/refman/4.1/en/password-security.html .
	For PostgreSQL, the file is ~/.pgpass, and it is detailed at
	http://www.postgresql.org/docs/8.0/interactive/libpq-pgpass.html .  Both of
	these files should be chmod-ded to 600, so that they can only be viewed by
	you, the creator.
 
	That being said, some common commands are...
 
- Backing Up a MySQL Database
$sBackupCommand = "mysqldump -u [user_name] [db_name] > $sFilename";
 
- Backing Up a PostgreSQL Database
$sBackupCommand = "pg_dump [db_name] -h localhost -U [user_name] -d -O > $sFilename";
 
- Backing Up a set of files (tar and gzip)
$sBackupCommand = "tar cvf $sFilename [directory]/*";
 
Whatever command you use, this script appends .gz to the filename after the command is executed.  */
$sBackupCommand = "[a backup command]";
 
// --- END OF SCRIPT PARAMETERS ---
//
// Edit below at your own risk.  :)
 
// Do the backup.
$sResult = passthru($sBackupCommand . "; gzip $sFilename");
$sFilename .= ".gz";
 
// Create the message.
$sMessage = "Compressed database backup file $sFilename attached.";
$sMimeBoundary = "<<<:" . md5(time());
$sData = chunk_split(base64_encode(implode("", file($sFilename))));
 
$sHeaders = "From: $sEmailAddress\r\n"
		. "MIME-Version: 1.0\r\n"
		. "Content-type: multipart/mixed;\r\n"
		. " boundary=\"$sMimeBoundary\"\r\n";
 
$sContent = "This is a multi-part message in MIME format.\r\n\r\n"
		. "--$sMimeBoundary\r\n"
		. "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"
		. "Content-Transfer-Encoding: 7bit\r\n\r\n"
		. $sMessage."\r\n"
		. "--$sMimeBoundary\r\n"
		. "Content-Disposition: attachment;\r\n"
		. "Content-Type: Application/Octet-Stream; name=\"$sFilename\"\r\n"
		. "Content-Transfer-Encoding: base64\r\n\r\n"
		. $sData."\r\n"
		. "--$sMimeBoundary\r\n";
 
// Send the message.
mail($sEmailAddress, $sEmailSubject, $sContent, $sHeaders);
 
// Delete the file - we don't need it any more.
unlink($sFilename);
?>

9 Comments »

  1. PHP Coding School » Blog Archive » php code [2008-03-29 06:53:44] said,

    March 29, 2008 at 1:03 am

    [...] A Handy PHP Backup Script By Daniel I found a script over on the Lunarpages Forums about using PHP to back up your site. I have taken it, modified it a little, beefed up the documentation a lot, and am now posting it here. You can download the source code for it, … DJS Consulting Tech Blog – http://www.djs-consulting.com/linux/blog [...]

  2. thet said,

    October 30, 2008 at 2:01 am

    thanks for your provided

  3. aman said,

    July 14, 2009 at 1:33 pm

    $sFilename = “backup-my_database_name-” . date(“Y-m-d”) . “.sql”; */
    $sFilename = “backup-[whatever-it-is]-” . date(“Y-m-d”) . “.[extension]“;

    How do I specify my table here which has to backed up?

  4. Daniel said,

    July 15, 2009 at 5:46 am

    Aman,

    The part you quoted just creates the filename – the actual backup command for MySQL is on line 56, and for PostgreSQL on line 59. These sample commands will grab all the tables in the database. They work well – I’ve recently had some problems on my development machine, and had to set up another one. I used backups modeled after the script above, and was able to create new test databases pretty quickly.

    That being said, if you’re using MySQL, add “–tables [list of tables]” after the [db_name] parameter to selectively dump certain tables – details on mysqldump can be found here. In a similar way, the “–table=[tablename]” option can be added to pgdump (and can also be qualified with a schema name using “–schema=[schemaname]) – more details on pgdump are here.

    I hope that helps! :)

  5. aman said,

    July 15, 2009 at 11:31 am

    Please can u give an example…

    $sFilename = “backup-database-” . date(“Y-m-d”) . “.csv”;

    $sBackupCommand = “mysqldump -u user database table111 > $sFilename”;

    /*user – the main username
    database – my database name
    table111 – the table to be backed up

    Is it correct? */

  6. Daniel said,

    July 21, 2009 at 6:54 am

    (Sorry for the delay)

    Aman, that looks like it should work. I can’t test it right now, as my main development machine is down, but the form follows the first example at the link I provided.

  7. Terry said,

    September 28, 2009 at 5:20 pm

    Thanks for the post!

    I decided to use the same basic framework to backup my website (substituting tar for mysqldump) but the resulting file is so big (about 20 meg) that the line
    $sData = chunk_split(base64_encode(implode(“”, file($sFilename))));

    throws an error. I’m working on fixing it, but any suggestions would be appreciated.

    Thanks!

    Terry

  8. A Handy PHP Backup Script « DJS Consulting Tech Blog | Yoobz said,

    March 5, 2010 at 11:58 pm

    [...] more: A Handy PHP Backup Script « DJS Consulting Tech Blog Posteado por: yoobz on March 29, [...]

  9. Gewinne said,

    May 16, 2010 at 7:08 am

    hola
    i’m so pleased that i found this site. that post was so nice. thanks again i added the rss on this page.
    are you planning to post similar posts?

RSS feed for comments on this post · TrackBack URL

Leave a Comment