当前位置: 首页 > 后端技术 > PHP

使用Laravel制作MySQL数据库备份计划任务

时间:2023-03-29 18:45:14 PHP

翻译首发于使用Laravel制作MySQL数据库备份计划任务,转载请注明出处。您可以通过在终端中运行一行命令来导出整个数据库。这个解决方案不仅简单明了,而且非常有效。但是还有更多的自动化解决方案。让我们找出它是什么!背景前几天,我登错了数据库,在线擦掉了18000行数据。更糟糕的是,我们没有这个数据库的备份。然后我决定编写一个脚本来自动导出数据库并将其保存到SQL文件中。另外,如果你需要一个强大的数据备份系统,你可以看看这个扩展。这样我们就不需要关注更多的数据库备份细节,只需要关注数据库的导出和导出计划即可。导出命令使用这一行代码片段,您可以快速将数据库导出到SQL文件。许多应用程序使用以下命令从数据库中导出数据。mysqldump-u[user]-p[pass][db]>[file_path]可以看到,我们需要传入用户名、密码和要导出的DB,然后将输出重定向到指定文件。食用简单方便,效果显着。现在让我们使用artisan命令将此命令包装起来,使其更容易运行并添加到cron作业中。Artiasn控制台界面预热使用artisan控制台(console)集成shell命令的一个重要起点是一次编写,到处运行的能力。我们要做的就是配置和使用这些配置。这意味着一旦参数被修改,我们不需要通过命令本身来调整它。接下来,我们可以创建这个控制台命令。通过运行phpartisanmake:comman命令创建自定义命令。此处我们的命令名为BackupDatabase。创建命令后,Laravel会自动向系统注册命令。您需要做的就是定义命令的签名。让我们预览命令文件;我们稍后会更详细地解释它是如何工作的:扩展命令{protected$signature='db:backup';protected$description='备份数据库';受保护的$进程;公共函数__construct(){parent::__construct();->process=newProcess(sprintf('mysqldump-u%s-p%s%s>%s',config('database.connections.mysql.username'),config('database.connections.mysql.password'),配置('database.connections.mysql.database'),storage_path('backups/backup.sql')));}publicfunctionhandle(){try{$this->process->mustRun();$this->info('备份成功。');}赶上(ProcessFailedException$异常){$this->error('备份过程失败。');}}}正如你所见,我们的命令签名是db:backup由于Laravel已经有了db命名空间,命令更加清晰。在构造函数中,我们实例化一个新的Symfony\Component\Process\Process实例。原因是这里我们需要使用Symfony的Process组件——而不是简单地调用shell_exec函数。该组件提供了许多不错的功能。例如,如果流程失败,我们可以抛出异常,然后高效地处理异常。如果使用进程的run()方法,需要手动检测运行错误并抛出异常。并且通过mustRun()方法,它会自动为我们抛出异常。您可以从文档中获取更多信息。我们将shell命令和所需参数传递给sprintf()函数,该函数用实际参数替换占位符。处理完流程实例,我们就可以进行handle)(方法的下一步了。在handle方法中,我们有一个try-catch代码块。首先,我们调用mustRun()方法。如果没有错误,我们发送给controlTaichung输出绿色信息;否则,抛出ProcessFailedException异常,在catch代码块中捕获,并向控制台输出错误信息。接下来呢?如果我们在控制台执行phpartisandb:backup命令,我们会到达这里,然后将数据库保存到storage/backups/backup.sql文件中。效果很好,但是,我们还有一些工作要做,就是写计划任务。写备份的计划任务task首先,在LaravelTask中很容易创建一个调度,它提供了一个内置的API接口来定义任务,简单并且支持链式操作。在继续阅读本文之前,强烈建议阅读中文翻译它的文档。然后,输入t在Console/Kernel.php文件中可以看到schedule()函数。我们可以定义任务和任务执行周期。比如我们想在每周一的23:00运行schedule,代码如下:protectedfunctionschedule(Schedule$schedule){$schedule->command('db:backup')->mondays()->at('23:00');}是不是很简单?更好的是,您可以在这里定义任意数量的命令。调度器会在指定的时间分别处理这些任务。要运行调度程序,我们需要执行phpartisanschedule:run命令,然后它会触发所有需要运行的命令。这太棒了,我们只需要一行命令就可以在指定的时间触发相应的任意命令。但现在的问题是如何管理调度器本身。这有点像先有鸡还是先有蛋的问题,但相信我,它并没有那么复杂。使用Forge设置调度器如果你还需要掌握CORN执行原理的基本支持,MohamedSaid有一系列文章深入讲解CRON相关知识。这里的关键点是我们不需要为每个计划任务创建一个CRON计时器。我们只需要如上所述定义任务执行运气,然后运行任务调用者。但是,我们需要设置运行phpartisanschedule:run命令的时间。如果您使用LaravelForge,您可以轻松创建cron作业。只需转到“计划程序”选项卡,您就可以创建任何您想要的计划任务。可以看到,schedule:run命令已经默认添加,您需要做的就是定义任务频率(frequency),并将默认命令替换为您服务器的命令。如果准备就绪,调度程序将在每次适当的时间运行并触发所有要执行的命令。乐于总结;我们可以提供不依赖于较大包的轻量级解决方案。在这里,我们也可以利用Laravel的优势来满足我们的需求。我们可以使用Process组件轻松导出数据库并将其包装在artisan命令中。然后我们可以为我们的命令快速设置一个执行周期,Laravel的调度器会处理剩下的事情。我们可以躺着做我们的工作。使用Laravel的原始调度MySQL备份