Ela's Notes
So Be It


Hitokoto ·
Linux下实现定时自动保存数据库并微信提醒
Elatis   PHP   1530 | 文章字数: 4478 字

写代码30分钟,学git3小时

最近碰巧看到了Server酱,感觉是一个挺有意思的项目,正好最近有定时备份数据库的想法,就做了一个项目练手

准备工作

安装依赖

确认你的系统里有:

  • php7.0及以上
  • php的PDO扩展
  • composer

    修改环境变量

    修改/etc/profile文件,在文件最后加上一行:EDITOR=vi; export EDITOR

    安装mysqldump-php

    新建一个目录用于存放项目,在这个目录下命令行中运行:

    composer require ifsnop/mysqldump-php:2.*

    如果成功会看到该目录下多了vendor文件夹,以及composer.jsoncomposer.lock三个文件

Server酱上注册并获取SCKEY

打开上述页面,使用GitHub账号登录即可,然后点右上方的发送消息,将你的SCKEY复制下来
然后点击微信推送,关注它的公众号

编写备份数据库逻辑

先新建一个env.php,将要用到的信息写在里面:

<?php
$HOST       = "localhost";
$DATABASE   = "mydatabase";
$USER       = "root";
$PASSWORD   = "your mysql password";
$SAVEPATH   = dirname(__FILE__)."/backups/";
//在Server酱http://sc.ftqq.com/3.version上注册并获得SCkey
$SCKEY      =  "your sckey";

这些设置都改成你自己的
然后新建一个AutoSave.php,用来编写详细逻辑
不过有个小问题,composer不知道为什么不能autoload刚才下载的Mysqldump类,需要手动引入
略微思考,就可以写出以下代码(没什么技术难点不解释了)

<?php
$dir_path = dirname(__FILE__);
include_once ($dir_path . '/env.php');
include_once ($dir_path . '/vendor/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php');
use \Ifsnop\Mysqldump\Mysqldump;

class DatabaseSave{

    private $HOST, $DATABASE, $USER, $PASSWORD, $SCKEY;
    private $msg_title, $msg_body;
    private $sc_endl = "           ";   //不知道怎么换行,这是一个待解决的问题
    private function save($PATH, $FILENAME = "dump.sql")
    {
        $save_info =    "保存的数据库为:".$this->DATABASE . $this->sc_endl .
                        "保存时间为: " . date("y-m-d_h:i:s") . $this->sc_endl.
                        "保存文件为:" . $PATH . $FILENAME;
        try {
            $dump = new Mysqldump('mysql:host=' . $this->HOST . ';dbname=' . $this->DATABASE, $this->USER, $this->PASSWORD);
            $dump->start($PATH . $FILENAME);

            $this->msg_title =  "数据库保存完毕";
            $this->msg_body  =   "主人, 数据库已经保存好啦~请及时下载哦~" . $this->sc_endl .
                                $save_info;
        } catch (Exception $e) {
            $this->msg_title = "数据库保存错误";
            $this->msg_body  =   "主人, 数据库保存出错啦qwq" . $this->sc_endl .
                                $save_info.
                                "报错信息为: " . $e->getMessage();
        }
    }

    private function sc_send(){
        $postdata = http_build_query(
            array(
                'text' => $this->msg_title,
                'desp' => $this->msg_body
            )
        );

        $opts = array('http' =>
            array(
                'method'  => 'POST',
                'header'  => 'Content-type: application/x-www-form-urlencoded',
                'content' => $postdata
            )
        );
        $context  = stream_context_create($opts);
        return $result = file_get_contents('https://sc.ftqq.com/'.$this->SCKEY.'.send', false, $context);
    }

    public function __construct($host, $database, $user, $password, $sckey)
    {
            $this->HOST     = $host;
            $this->DATABASE = $database;
            $this->USER     = $user;
            $this->PASSWORD = $password;
            $this->SCKEY    = $sckey;
    }

    public function start($path, $filename){
        $this->save($path, $filename);
        $this->sc_send();
    }
}

$database_save = new DatabaseSave($HOST, $DATABASE, $USER, $PASSWORD, $SCKEY);
$database_save->start($SAVEPATH, $DATABASE.'_'.date("y_m_d").".sql");

写好后保存退出

设置定时执行

在刚才的目录下创建一个名叫rootcron的文件,用于编写cron指令
cron指令的格式如下:
分 时 日 月 星期 要运行的命令

  • 第1列分钟0~59
  • 第2列小时0~23(0表示子夜)
  • 第3列日1~31
  • 第4列月1~12
  • 第5列星期0~7(0和7表示星期天)
  • 第6列要运行的命令

当对应的时刻满足前五列时就会运行第六列的指令

缺省项用*代替,表示


* * * * * ls表示每分钟运行一次ls指令
5 * * * * * ls表示每5分钟运行一次ls指令
0 8 * * * ls表示每天8:00运行一次ls指令

如果还不理解,可以看这里

我个人设置的是每周日8点备份数据库,就在里面填上(注意要敲一个空行)

0 8 * * 7 php /backup/AutoSave.php

并且文件都要填上绝对路径,因为cron的执行位置不在你启动它的文件夹

最后依次使用以下指令激活刚才写的命令

# crontab -u root rootcron  //-u 后面的 root 表示执行命令的用户 rootcron 表示储存了要执行指令的文件
# systemctl start cron      //开启cron服务
  • 如果你要查看当前有哪些cron命令,可以使用:

    # crontab -l

    如果出现你在rootcron里面填入的指令,说明成功,如

    0 8 * * 7 php /backup/AutoSave.php
  • 如果你要取消定时任务,可以使用以下两条指令的任一条
    # crontab -r
    # systemctl stop cron

    这样就完成每周备份数据库啦~

GitHub地址: https://github.com/elatisy/autoSaveMysql

评论

发送失败 可能是您的发言太频繁或联系方式有误

提交评论

Theme LightWhite Made by Archeb With
自豪地使用Typecho
© 2017 - 2020 elatis.cn 版权所有 ICP证: 冀ICP备18008017号-1
全站共 21.03 W 字
博客已经运行了