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