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