写代码30分钟,学git3小时
最近碰巧看到了Server酱,感觉是一个挺有意思的项目,正好最近有定时备份数据库的想法,就做了一个项目练手
准备工作
安装依赖
确认你的系统里有:
- php7.0及以上
- php的PDO扩展
- composer
修改环境变量
修改/etc/profile文件,在文件最后加上一行:
EDITOR=vi; export EDITOR
安装mysqldump-php
新建一个目录用于存放项目,在这个目录下命令行中运行:
composer require ifsnop/mysqldump-php:2.*
如果成功会看到该目录下多了
vendor
文件夹,以及composer.json
和composer.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
评论