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 copy and paste it from below to customize it for your own use.
<?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 //dev.mysql.com/doc/refman/4.1/en/password-security.html . For PostgreSQL, the file is ~/.pgpass, and it is detailed at //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);