摘要:現(xiàn)在讓我們將這個(gè)命令通過(guò)使用命令進(jìn)行封裝,使其更易于運(yùn)行和可加入計(jì)劃任務(wù)。編寫備份任務(wù)的計(jì)劃任務(wù)首先,在中能夠輕松創(chuàng)建計(jì)劃任務(wù)。
譯文首發(fā)于 使用 Laravel 制定 MySQL 數(shù)據(jù)庫(kù)備份計(jì)劃任務(wù),轉(zhuǎn)載請(qǐng)注明出處。
你可以在終端里通過(guò)運(yùn)行一行命令導(dǎo)出整個(gè)數(shù)據(jù)庫(kù)。這種方案不僅簡(jiǎn)單直接而且有效。不過(guò)有更加自動(dòng)化的解決方案。讓我們來(lái)看看究竟是什么!
背景幾天前,我登錄到錯(cuò)誤的數(shù)據(jù)庫(kù)中然后干掉了 18 000 行線上數(shù)據(jù)記錄。更糟糕的是,我們沒(méi)有對(duì)這個(gè)數(shù)據(jù)庫(kù)進(jìn)行備份。然后,我決定編寫一個(gè)能夠自動(dòng)完成數(shù)據(jù)庫(kù)導(dǎo)出并保存到 SQL 文件的腳本。
另外,如果你需要一款功能強(qiáng)大的數(shù)據(jù)備份系統(tǒng),你可以看看 這個(gè) 擴(kuò)展。這樣我們就無(wú)需關(guān)注更多的數(shù)據(jù)庫(kù)備份細(xì)節(jié)而僅需將焦點(diǎn)放到數(shù)據(jù)庫(kù)導(dǎo)出和導(dǎo)出計(jì)劃上。
導(dǎo)出命令使用這個(gè)單行 snippet,你可以快速的將數(shù)據(jù)庫(kù)導(dǎo)出到 SQL 文件。很多應(yīng)用使用下面這個(gè)命令從數(shù)據(jù)庫(kù)導(dǎo)出數(shù)據(jù)。
mysqldump -u[user] -p[pass] [db] > [file_path]
正如你所看到的那樣,我們需要傳入用戶名、密碼和需要導(dǎo)出的 DB,然后將輸出重定向到指定的文件。食用簡(jiǎn)單方便,功效顯著。
現(xiàn)在讓我們將這個(gè)命令通過(guò)使用 artisan 命令進(jìn)行封裝,使其更易于運(yùn)行和可加入計(jì)劃任務(wù)。
Artiasn 控制臺(tái)接口熱身通過(guò)使用 artisan 控制臺(tái)(console)集成 shell 命令的一個(gè)重要出發(fā)點(diǎn)是,能夠一次編寫到處運(yùn)行。我們要做的是配置并使用這些配置。這意味著,一旦有參數(shù)被修改,我們不需要通過(guò)命令本身進(jìn)行調(diào)整。接下來(lái),我們可以來(lái)創(chuàng)建這個(gè)控制臺(tái)命令。
通過(guò)運(yùn)行 php artisan make:comman 命令來(lái)創(chuàng)建一個(gè)自定義命令。這里我們的命令命名為 BackupDatabase。當(dāng)創(chuàng)建完你的命令后,Laravel 會(huì)自動(dòng)的將命令注冊(cè)到系統(tǒng)中。你需要做的,僅僅是去定義命令的簽名(signature)。
讓我們來(lái)預(yù)覽一下這個(gè)命令文件;稍后會(huì)詳細(xì)解釋它是如何運(yùn)行的:
process = new Process(sprintf( "mysqldump -u%s -p%s %s > %s", config("database.connections.mysql.username"), config("database.connections.mysql.password"), config("database.connections.mysql.database"), storage_path("backups/backup.sql") )); } public function handle() { try { $this->process->mustRun(); $this->info("The backup has been proceed successfully."); } catch (ProcessFailedException $exception) { $this->error("The backup process has been failed."); } } }
你也看到了,我們的命令簽名為 db:backup。由于 Laravel 已經(jīng)有了 db 命令空間,這樣命令更加清晰命令。
在構(gòu)造函數(shù)中,我們實(shí)例化一個(gè)新的 SymfonyComponentProcessProcess 實(shí)例。原因是這里我們需要使用 Symfony 的 Process 組件 - 而不是簡(jiǎn)單的調(diào)用 shell_exec 函數(shù)。這個(gè)組件提供了很多好贊的特性。比如,如果進(jìn)程失敗,我們可以拋出異常,然后有效處理異常。
如果你是用的是 process 的 run() 方法,你需要手動(dòng)的去檢測(cè)運(yùn)行錯(cuò)誤然后拋出異常。而通過(guò) mustRun() 方法,它會(huì)自動(dòng)的給我們拋出異常。你可以從 文檔 中獲取更多信息。
我們將 shell 命令和所需的參數(shù)傳入到 sprintf() 函數(shù)中,它會(huì)將占位符替換成實(shí)際的參數(shù)。在處理完 process 實(shí)例后,我們可以進(jìn)行下一步 handle)( 方法的處理。
在 handle 方法里,我們有個(gè)一 try-catch 代碼塊。首先,我們調(diào)用 mustRun() 方法,如果沒(méi)有錯(cuò)誤,我們向控制臺(tái)中輸出綠色的信息;否則,拋出 ProcessFailedException 異常,并在 catch 代碼塊中捕獲,并向控制臺(tái)中輸出 error 信息。
接下來(lái)呢?如果我們?cè)诳刂婆_(tái)執(zhí)行 php artisan db:backup 命令,我們就會(huì)到此處數(shù)據(jù)庫(kù)然后將其保存到 storage/backups/backup.sql 文件。運(yùn)行良好,不過(guò),我們還有一些工作要做,就是編寫計(jì)劃任務(wù)。
編寫備份任務(wù)的計(jì)劃任務(wù)首先,在 Laravel 中能夠輕松創(chuàng)建計(jì)劃任務(wù)。它內(nèi)置提供了既簡(jiǎn)單又支持鏈?zhǔn)讲僮鞯亩x任務(wù)的 API 接口。在繼續(xù)本文閱讀之前,強(qiáng)烈建議閱讀 它的文檔 中譯。
然后,進(jìn)入到 Console/Kernel.php 文件看看 schedule() 函數(shù)。我們可以定義任務(wù)和任務(wù)執(zhí)行周期。比如,我們希望在 每周一的 23:00 運(yùn)行計(jì)劃,它的編碼如下:
protected function schedule(Schedule $schedule) { $schedule->command("db:backup")->mondays()->at("23:00"); }
是不是很簡(jiǎn)單?更棒的是,你可以在這里定義任意多個(gè)命令。調(diào)度器(scheduler)會(huì)在指定的時(shí)間分別處理這些任務(wù)。
若要運(yùn)行這個(gè)調(diào)度器,我們需要執(zhí)行 php artisan schedule:run 命令,然后它會(huì)觸發(fā)所有需要運(yùn)行的命令。這很棒,我們僅需一行命令就可以在指定的時(shí)間觸發(fā)對(duì)應(yīng)的任意命令。
但現(xiàn)在的問(wèn)題時(shí),如何管理調(diào)度器自身。這個(gè)有點(diǎn)像雞生蛋蛋生雞的問(wèn)題,但是相信我,沒(méi)有這么復(fù)雜。
使用 Forge 設(shè)置調(diào)度器如果你還需要掌握 CORN 執(zhí)行原理相關(guān)基礎(chǔ)支持, Mohamed Said 有一個(gè)系列文章 深入講解了 CRON 相關(guān)知識(shí)。其中關(guān)鍵點(diǎn)在于,我們無(wú)需為每個(gè)計(jì)劃任務(wù)創(chuàng)建 CRON 定時(shí)器。我們僅需向前面介紹的那樣定義任務(wù)執(zhí)行手氣,然后運(yùn)行任務(wù)調(diào)取器就好了。
不過(guò),我們需要設(shè)置運(yùn)行 php artisan schedule:run 命令的時(shí)間。如果你使用了 Laravel Forge,那么可以很輕易的創(chuàng)建定時(shí)任務(wù)。只需進(jìn)入到 Scheduler 選項(xiàng)卡,然后你就能創(chuàng)建任何你想要的計(jì)劃任務(wù)。
如你所見,默認(rèn)的已將添加了 schedule:run 命令,你需要做的就是,定義任務(wù)周期(frequency)以及替換默認(rèn)命令到你服務(wù)器的命令。
如果準(zhǔn)備好了,調(diào)度器將每次在適當(dāng)?shù)臅r(shí)候運(yùn)行,并觸發(fā)所有要執(zhí)行的命令。
總結(jié)很高興; 我們可以提供輕量級(jí)的解決方案,而不依賴于一個(gè)更大的包。在這里,我們也可以利用 Laravel 的優(yōu)勢(shì)來(lái)滿足需求。
我們可以使用 Process 組件輕松導(dǎo)出數(shù)據(jù)庫(kù),并將其封裝在 artisan 命令中。然后,我們可以快速地為我們的命令設(shè)置一個(gè)執(zhí)行周期,而 Laravel 的調(diào)度程序?qū)⒇?fù)責(zé)剩下的工作。我們可以躺著就把活該干了。
原文Scheduling MySQL Backups with Laravel
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29232.html
閱讀 1007·2023-04-25 23:40
閱讀 3771·2021-11-22 15:22
閱讀 3619·2021-10-09 09:44
閱讀 3463·2021-09-23 11:52
閱讀 1323·2021-09-22 15:43
閱讀 841·2021-09-10 10:51
閱讀 2271·2021-09-06 15:02
閱讀 3270·2021-09-06 15:02