你的網(wǎng)站慢嗎?加載需要很長(zhǎng)時(shí)間嗎?用戶是否抱怨它幾乎 無(wú)法使用 ?您應(yīng)該檢查您的數(shù)據(jù)庫(kù)查詢。我將向您展示一種輕松分析所有數(shù)據(jù)庫(kù)查詢的簡(jiǎn)潔方法。
Laravel 9 保姆級(jí)視頻教程,想學(xué)不會(huì)都難!進(jìn)入學(xué)習(xí)
當(dāng)然,您的網(wǎng)站速度慢的原因有很多,但最常見(jiàn)的原因之一是數(shù)據(jù)庫(kù)查詢速度慢。
但是在 laravel 中,我們(大多數(shù)時(shí)候)不使用 SQL 從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),我們使用 Eloquent ORM 和 查詢構(gòu)建器 ,這有時(shí)會(huì)導(dǎo)致很難查明造成我們網(wǎng)站如此緩慢的查詢。
DB::listen()
幸運(yùn)的是,在 laravel 中,我們可以定義一個(gè)在每次執(zhí)行查詢時(shí)調(diào)用的回調(diào)(參見(jiàn) 此處)。為此,請(qǐng)將以下代碼添加到任何服務(wù)提供者(例如 AppServiceProvider):
public function boot() { DB::listen(function ($query) { // TODO: make this useful }); }
如您所見(jiàn),我們接收了一個(gè)變量 $query
,這個(gè)變量是 QueryExecuted 類的一個(gè)實(shí)例。這意味著我們可以訪問(wèn)有關(guān)已執(zhí)行查詢的一些信息:
DB::listen(function ($query) { $query->sql; // 執(zhí)行的 sql 字符串 $query->bindings; // 傳遞給sql查詢的參數(shù)(這將替換sql字符串中的 "?") $query->time; // 執(zhí)行查詢所用的時(shí)間; });
這是非常有用的信息,現(xiàn)在我們可以通過(guò)查看 $query->time
屬性來(lái)識(shí)別慢查詢。 但這并沒(méi)有告訴我們?cè)谖覀兊拇a中查詢執(zhí)行的位置。
我怎么知道查詢是在哪里執(zhí)行的?
即使該 $query
變量沒(méi)有給我們?nèi)魏侮P(guān)于其來(lái)源的信息, 我們?nèi)匀豢梢允褂?PHP 內(nèi)置函數(shù) debug_backtrace()
獲取該信息。
DB::listen(function ($query) { dd(debug_backtrace()); });
如果你在你的項(xiàng)目上運(yùn)行它,你會(huì)在瀏覽器上看到類似這樣的東西:
array:63 [▼ 0 => array:7 [▼ "file"=>"/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php" "line" => 404 "function" => "AppProviders{closure}" "class" => "AppProvidersAppServiceProvider" "object" => AppProvidersAppServiceProvider {#140 ▶} "type" => "->" "args" => array:1 [▶] ] 1 => array:7 [▼ "file" => "/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php" "line" => 249 "function" => "IlluminateEvents{closure}" "class" => "IlluminateEventsDispatcher" "object" => IlluminateEventsDispatcher {#27 ▶} "type" => "->" "args" => array:2 [▶] ] 2 => array:7 [▼ "file" => "/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Database/Connection.php" "line" => 887 "function" => "dispatch" "class" => "IlluminateEventsDispatcher" "object" => IlluminateEventsDispatcher {#27 ▶} "type" => "->" "args" => array:1 [▶] ] ....
這是一個(gè)數(shù)組,其中包含請(qǐng)求中到目前為止的每個(gè)函數(shù)調(diào)用。我將只關(guān)注每個(gè)數(shù)組中的 file
和 line
鍵。
如果你仔細(xì)看,你會(huì)發(fā)現(xiàn)在我的例子中有 63 個(gè)函數(shù)調(diào)用,這是一個(gè)簡(jiǎn)單的應(yīng)用程序,如果在更復(fù)雜的應(yīng)用程序中,可能會(huì)