请使用php写一个备份wordpress网站,包括网站程序和mysql中的网站数据,然后打包压缩,通过email发送到25906016@qq.com邮箱

你需要一个PHP脚本,能够自动备份WordPress的网站程序文件和MySQL数据库数据,将它们打包压缩后,通过邮件发送到指定的QQ邮箱(25906016@qq.com)。

实现思路

  1. 数据库备份:使用mysqldump命令导出WordPress数据库为SQL文件
  2. 文件备份:将WordPress网站根目录的所有文件打包
  3. 压缩打包:将数据库备份文件和网站文件包合并压缩为一个ZIP文件
  4. 邮件发送:使用PHP的PHPMailer库(更稳定可靠)发送包含压缩包的邮件
  5. 清理临时文件:发送完成后删除临时生成的备份文件,避免占用空间

前置条件

  1. 服务器需安装zipmysqldump工具(Linux系统一般默认安装)
  2. 安装PHPMailer(通过Composer或手动下载)
  3. PHP需开启exec()shell_exec()函数(需在php.ini中解除禁用)
  4. QQ邮箱需开启SMTP服务并获取授权码(不是登录密码)

完整代码

<?php
/**
 * WordPress网站自动备份并邮件发送脚本
 * 作者:编程助手
 * 注意:请根据实际情况修改配置信息
 */

// ==================== 配置信息(请根据你的实际情况修改)====================
// WordPress数据库配置
$db_host = 'localhost';       // 数据库主机
$db_user = 'wp_user';         // 数据库用户名
$db_pass = 'wp_password';     // 数据库密码
$db_name = 'wp_database';     // WordPress数据库名

// WordPress网站根目录(绝对路径)
$wp_root = '/var/www/html/wordpress';

// 临时备份目录(确保PHP有读写权限)
$backup_dir = '/tmp/wp_backup/';

// 邮件配置
$smtp_host = 'smtp.qq.com';   // QQ邮箱SMTP服务器
$smtp_port = 465;             // SMTP端口(465为SSL,587为TLS)
$smtp_user = '你的QQ邮箱@qq.com'; // 发送邮件的QQ邮箱
$smtp_pass = '你的QQ邮箱SMTP授权码'; // QQ邮箱SMTP授权码
$to_email = '25906016@qq.com';      // 接收备份的邮箱
$email_subject = 'WordPress网站备份_' . date('Y-m-d_H-i-s');

// ==================== 核心备份逻辑 ====================

// 创建临时备份目录
if (!file_exists($backup_dir)) {
    mkdir($backup_dir, 0755, true);
}

// 1. 备份MySQL数据库
$db_backup_file = $backup_dir . 'wp_database_' . date('Y-m-d_H-i-s') . '.sql';
$mysqldump_cmd = "mysqldump -h{$db_host} -u{$db_user} -p{$db_pass} {$db_name} > {$db_backup_file}";
exec($mysqldump_cmd, $output, $return_var);

if ($return_var !== 0) {
    die("数据库备份失败!错误码:{$return_var}");
}

// 2. 备份网站文件
$files_backup_file = $backup_dir . 'wp_files_' . date('Y-m-d_H-i-s') . '.zip';
$zip_cmd = "zip -r {$files_backup_file} {$wp_root}";
exec($zip_cmd, $output, $return_var);

if ($return_var !== 0) {
    die("网站文件备份失败!错误码:{$return_var}");
}

// 3. 合并压缩为最终备份包
$final_backup_file = $backup_dir . 'wp_full_backup_' . date('Y-m-d_H-i-s') . '.zip';
$merge_zip_cmd = "zip -j {$final_backup_file} {$db_backup_file} {$files_backup_file}";
exec($merge_zip_cmd, $output, $return_var);

if ($return_var !== 0) {
    die("合并备份文件失败!错误码:{$return_var}");
}

// ==================== 发送邮件 ====================
// 引入PHPMailer(如果通过Composer安装,使用autoload)
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
require 'PHPMailer/src/Exception.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// 初始化PHPMailer
$mail = new PHPMailer(true);

try {
    // 服务器配置
    $mail->SMTPDebug = 0;                      // 关闭调试模式(0=关闭,2=详细)
    $mail->isSMTP();                           // 使用SMTP
    $mail->Host       = $smtp_host;            // SMTP服务器
    $mail->SMTPAuth   = true;                  // 启用SMTP认证
    $mail->Username   = $smtp_user;            // SMTP用户名
    $mail->Password   = $smtp_pass;            // SMTP密码(授权码)
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // 启用SSL加密
    $mail->Port       = $smtp_port;            // 端口号

    // 收件人
    $mail->setFrom($smtp_user, 'WordPress备份助手');
    $mail->addAddress($to_email);              // 接收邮箱

    // 邮件内容
    $mail->isHTML(true);                       // 启用HTML格式
    $mail->Subject = $email_subject;
    $mail->Body    = "您好,这是您的WordPress网站自动备份文件,备份时间:" . date('Y-m-d H:i:s');
    $mail->AltBody = "您好,这是您的WordPress网站自动备份文件,备份时间:" . date('Y-m-d H:i:s');

    // 添加附件
    $mail->addAttachment($final_backup_file);

    // 发送邮件
    $mail->send();
    echo "备份成功!邮件已发送至 {$to_email}";
} catch (Exception $e) {
    die("邮件发送失败!错误信息:{$mail->ErrorInfo}");
}

// ==================== 清理临时文件 ====================
function deleteDir($dir) {
    if (!file_exists($dir)) return true;
    if (!is_dir($dir)) return unlink($dir);
    foreach (scandir($dir) as $item) {
        if ($item == '.' || $item == '..') continue;
        if (!deleteDir($dir . DIRECTORY_SEPARATOR . $item)) return false;
    }
    return rmdir($dir);
}

// 删除临时备份目录及文件
deleteDir($backup_dir);

?>

关键配置说明

  1. 数据库配置:修改$db_host$db_user$db_pass$db_name为你的WordPress数据库信息
  2. 网站目录$wp_root填写WordPress的绝对路径(如/var/www/html/wp
  3. 邮件配置

    • $smtp_user:填写你的QQ邮箱(发送方)
    • $smtp_pass:QQ邮箱的SMTP授权码(需在QQ邮箱设置-账户中开启POP3/SMTP后获取)
  4. 权限要求:运行脚本的PHP进程需要有:

    • 读取WordPress目录的权限
    • 写入$backup_dir目录的权限
    • 执行mysqldumpzip命令的权限

安装PHPMailer

方法1:Composer安装(推荐)

composer require phpmailer/phpmailer

方法2:手动下载

  1. 从GitHub下载:https://github.com/PHPMailer/PHPMailer
  2. src目录放到脚本同级目录
  3. 确保脚本中require路径正确

总结

  1. 核心功能:脚本通过mysqldump备份数据库、zip打包网站文件,合并后通过PHPMailer发送邮件
  2. 关键注意事项

    • 确保服务器安装了zipmysqldump工具
    • QQ邮箱需开启SMTP并使用授权码(而非登录密码)
    • PHP需解除exec()shell_exec()函数的禁用
  3. 安全建议

    • 脚本不要放在网站根目录,避免被外网访问
    • 定期更换SMTP授权码
    • 备份完成后自动清理临时文件,避免磁盘空间占用

+++++++++++++================================
在linux下,怎样使用cron定时执行备份
你想知道在Linux系统中,如何通过cron定时任务来自动执行我们之前写的WordPress备份PHP脚本,实现定期自动备份。

实现步骤

1. 准备工作(确保脚本可独立运行)

在配置定时任务前,先手动测试脚本能否正常执行:

# 切换到脚本所在目录(示例路径)
cd /root/backup_scripts
# 执行PHP脚本(指定PHP完整路径,避免环境变量问题)
/usr/bin/php /root/backup_scripts/wp_backup.php

如果脚本能正常生成备份并发送邮件,说明脚本本身无问题,可继续配置cron。

2. 编辑cron定时任务

Linux下管理cron任务主要用crontab命令,推荐使用当前运行脚本的用户(如root)配置,避免权限问题。

步骤1:打开crontab编辑界面
# 编辑当前用户的cron任务(推荐用root用户,避免权限不足)
sudo crontab -e
# 如果是普通用户,直接执行
crontab -e

首次执行会提示选择编辑器,推荐选nano(简单易操作)。

步骤2:添加定时任务规则

在打开的编辑界面末尾,添加定时执行脚本的规则,格式如下:

# 定时规则 执行的命令
# 示例:每天凌晨2点执行备份脚本
0 2 * * * /usr/bin/php /root/backup_scripts/wp_backup.php > /var/log/wp_backup.log 2>&1

3. cron定时规则详解

cron的时间格式为:分 时 日 月 周 命令,每个字段含义如下:

字段取值范围说明
0-59分钟
0-23小时
1-31日期
1-12月份
0-7(0/7都代表周日)星期几

常用示例

  • 0 2 * * *:每天凌晨2点执行
  • 0 2 * * 0:每周日凌晨2点执行
  • 0 2 1 * *:每月1号凌晨2点执行
  • */30 * * * *:每30分钟执行一次

4. 关键配置说明

  • PHP路径:必须用which php查看系统中PHP的完整路径(如/usr/bin/php/usr/local/php/bin/php),避免cron环境变量缺失导致找不到PHP。

    # 查看PHP完整路径
    which php
  • 日志输出> /var/log/wp_backup.log 2>&1 是将脚本执行的日志(包括错误信息)输出到指定文件,方便排查问题:

    • >:标准输出重定向
    • 2>&1:将错误输出重定向到标准输出,最终都写入日志文件
  • 权限问题

    • 确保cron执行用户(如root)对脚本文件、WordPress目录、临时备份目录有读写权限。
    • 脚本中的exec()执行mysqldump/zip命令时,最好也用完整路径(which mysqldump/which zip查看)。

5. 验证cron任务是否生效

步骤1:查看已配置的cron任务
sudo crontab -l  # 查看root用户的cron任务
crontab -l       # 查看当前用户的cron任务

能看到刚添加的备份脚本规则,说明配置成功。

步骤2:检查cron服务状态
# CentOS/RHEL 7+
systemctl status crond
# Ubuntu/Debian
systemctl status cron

如果服务未运行,启动并设置开机自启:

# CentOS/RHEL 7+
systemctl start crond
systemctl enable crond
# Ubuntu/Debian
systemctl start cron
systemctl enable cron
步骤3:查看执行日志
# 查看脚本执行日志
tail -f /var/log/wp_backup.log
# 查看cron系统日志(排查任务是否触发)
# CentOS/RHEL
tail -f /var/log/cron
# Ubuntu/Debian
grep CRON /var/log/syslog

总结

  1. 核心步骤:先验证脚本可手动运行 → 用crontab -e添加定时规则 → 配置日志输出便于排查 → 验证cron服务和任务。
  2. 关键注意事项

    • cron执行环境的环境变量缺失,必须使用PHP、mysqldump、zip等命令的完整路径
    • 配置日志输出,是排查cron任务失败的核心手段。
    • 优先使用root用户配置cron,避免权限不足导致备份失败。
  3. 排错要点

    • 检查PHP/命令的完整路径是否正确。
    • 查看脚本执行日志和cron系统日志。
    • 确保执行用户对所有相关目录/文件有足够权限。

标签: none