私のチームと私はかなり大きなプロジェクトに取り組んでいます。コントローラー、ビュー内のビューコンポーザー(遅延ロード)、およびおそらく他のサービスでも、クエリはどこにでもあります。すべてを追跡するのは難しくなり、ページの読み込み速度は現時点ではかなり遅くなっています。
すべてのクエリをログに記録してダンプするには、\ DB :: enableQueryLog()および\ DB :: getQueryLog()をどこに配置しますか?基本的に、クエリが発生する前に発生するコード内の場所を探しています(enableQueryLog()を配置するため)。ビューがレンダリングされた後に発生する場所を探しています(getQueryLog()をダンプするため)。
これについてはどうすればいいでしょうか?
前もって感謝します。
これが完璧な例です。
https://laravel.com/docs/5.3/database#listening-for-query-events
app\Providers\AppServiceProvider.phpを開き、次をBoot()
関数に追加します。
DB::listen(function ($query) {
var_dump([
$query->sql,
$query->bindings,
$query->time
]);
});
これをProviders/AppServiceProvider.phpファイルに追加し、laravel末尾付きのログファイルで確認できます。
tail -f storage/logs/laravel.log
ログに記録するクエリでフィルタリングすることもできます。たとえば、ここではLaravel= Passportを使用しており、すべてのoauthクエリをログに記録したくありませんでした。
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;
public function register() {
if (App::environment('local') && env('APP_URL') == 'http://localhost') {
Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
// filter oauth ones
if (!str_contains($query->sql, 'oauth')) {
Log::debug($query->sql . ' - ' . serialize($query->bindings));
}
});
}
}
アプリで実行されるクエリを印刷する場合は、次の手順を実行します。
Step1:AppServiceProvider.phpファイルに移動します。 //ファイルパスApp\Providers\AppServiceProvider.php
Step2:boot()メソッドを作成し、以下のコードを貼り付けます。
public function boot() {
// Log queries
if (true) {
\DB::listen(function ($query) {
\Log::info(
$query->sql, $query->bindings, $query->time
);
});
}
}
Step:Lumen.logまたはlaravel.logファイルでクエリを確認できます。ファイルパスは、laravel_app\storage\logs\laravel.logまたはLumen.logです。
楽しい....
クエリが実行されるコードのすぐ上にこのコードを配置します
\DB::listen(function($sql) {
die(\Illuminate\Support\Str::replaceArray('?', $sql->bindings, $sql->sql));
});
実行可能なクエリ用に変更したばかりです:
\DB::listen(function ($query) {
// Enclose in single quotes for string params.
$bindings = collect($query->bindings)->map(function ($param) {
if(is_numeric($param)) {
return $param;
} else {
return "'$param'";
}
});
\Log::info(\Illuminate\Support\Str::replaceArray('?', $bindings->toArray(), $query->sql));
});
また、利用可能なパッケージがあります:
https://packagist.org/packages/technoknol/log-my-queries
ミドルウェアにエントリをインストールして追加するだけです。 laravel.log
デフォルトログファイルにすべてのクエリを記録します。
リクエストの完了後に実行され、クエリを記録するミドルウェアを追加します... Terminable Middlwares を参照してください