你可以在終端機裡透過執行一行指令匯出整個資料庫。這種方案不僅簡單直接而且有效。不過有更自動化的解決方案。讓我們來看看究竟是什麼吧!
背景
幾天前,我登入錯誤的資料庫中然後乾掉了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)。
讓我們來預覽這個指令檔;稍後會詳細解釋它是如何運作的:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Symfony\Component\Process\Process; use Symfony\Component\Process\Exception\ProcessFailedException; class BackupDatabase extends Command { protected $signature = 'db:backup'; protected $description = 'Backup the database'; protected $process; public function __construct() { parent::__construct(); $this->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 指令空間,這樣指令就更清晰指令。
在建構子中,我們實例化一個新的 Symfony\Component\Process\Process 實例。原因是這裡我們需要使用 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 的調度程序將負責剩下的工作。我們可以躺著就把活該乾了。
相關推薦:
laravel框架模型model的建立與使用方法#以上是如何使用Larave制定一個MySQL資料庫備份排程任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境