这个程序的功能是备份drupal数据库中的文章,即node_revisions表中的内容。当发现有新的文章的时候,它会将新文章保存为一文本文件在服务器上,同时通过邮件将此文章发送到指定的email地址。以后无论是文件系统还是数据库发生数据丢失,都可以找回这些文章,并用drupal重新将这些文章添加进数据库。
这种备份方式是对全站备份的一种补充,因为全站备份工作量大,不可能做到很频繁。而这个备份程序所需的工作量很小,对服务器产生的压力很小,可以做到比较频繁的执行,例如本站设定为15分钟执行一次这个备份脚本。而频繁的备份可以将文章编辑中间过程也保存下来。当然,它不能替代全站备份,因为它只备份了文章,而忽略了数据库中其他内容,另一方面,手工重新添加大量文章是非常费力的事情。
因为这个程序直接访问数据库,而并不依赖于drupal,所以只要稍加修改也可以应用于别的CMS/Blog系统。
它的原理很简单。程序开头的两个function来源于drupal 6,用于编码email的title。之后就开始连接数据库,取出比较新的文章。如果发现还没有备份过这些文章,则将它们以文本文件形式备份下来,同时通过php的mail()函数将它们发送到指定的地址。
这种备份方式是对全站备份的一种补充,因为全站备份工作量大,不可能做到很频繁。而这个备份程序所需的工作量很小,对服务器产生的压力很小,可以做到比较频繁的执行,例如本站设定为15分钟执行一次这个备份脚本。而频繁的备份可以将文章编辑中间过程也保存下来。当然,它不能替代全站备份,因为它只备份了文章,而忽略了数据库中其他内容,另一方面,手工重新添加大量文章是非常费力的事情。
因为这个程序直接访问数据库,而并不依赖于drupal,所以只要稍加修改也可以应用于别的CMS/Blog系统。
它的原理很简单。程序开头的两个function来源于drupal 6,用于编码email的title。之后就开始连接数据库,取出比较新的文章。如果发现还没有备份过这些文章,则将它们以文本文件形式备份下来,同时通过php的mail()函数将它们发送到指定的地址。
<?php function drupal_truncate_bytes($string, $len) { if (strlen($string) <= $len) { return $string; } if ((ord($string[$len]) < 0x80) || (ord($string[$len]) >= 0xC0)) { return substr($string, 0, $len); } while (--$len >= 0 && ord($string[$len]) >= 0x80 && ord($string[$len]) < 0xC0) {}; return substr($string, 0, $len); } function mime_header_encode($string) { if (preg_match('/[^\x20-\x7E]/', $string)) { $chunk_size = 47; // floor((75 - strlen("=?UTF-8?B??=")) * 0.75); $len = strlen($string); $output = ''; while ($len > 0) { $chunk = drupal_truncate_bytes($string, $chunk_size); $output .= ' =?UTF-8?B?'. base64_encode($chunk) ."?=\n"; $c = strlen($chunk); $string = substr($string, $c); $len -= $c; } return trim($output); } return $string; } chdir('/var/backup'); $db = mysql_connect('host.example.com', 'db_user', 'db_pass') or die('Unable to connect to MySQL server'); $select = mysql_select_db('select_db', $db) or die(mysql_error($db)); $result = mysql_query("SET NAMES 'utf8'", $db) or die(mysql_error($db)); $time = time() - 24 * 60 * 60; #$time = 0; $result = mysql_query("SELECT vid,timestamp,title,body FROM node_revisions WHERE timestamp>$time", $db) or die(mysql_error($db)); while ($row = mysql_fetch_assoc($result)) { $name = 'rev_'. $row['vid'] .'_'. date('Ymd_His', $row['timestamp']) .'.txt'; if (!file_exists($name)) { echo $name .' -- '. $row['title'] .'<br />'; file_put_contents($name, $row['title'] ."\n\n". $row['body']); file_put_contents("backup.log", date('Y-m-d H:i:s') .' '. $name .' '. $row['title'] ."\n", FILE_APPEND); mail('backup @example.com', mime_header_encode($row['title']), str_replace("\r", '', $row['body']), 'From: email @example.com'); } } mysql_close($db);
- labrador's blog
- 10259 次点击
发表新评论