`
weiqingfei
  • 浏览: 320604 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

Laravel5中,监视查询SQL

    博客分类:
  • PHP
 
阅读更多

创建event handler

写道
php artisan handler:event QueryLogTracker

 

QueryLogTracker.php

<?php

namespace App\Handlers\Events;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Log\Writer;
use Monolog\Logger as Monolog;
use App;

class QueryLogTracker
{
    protected $myLogger;
    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        $this->myLogger = new Writer( new Monolog( 'SQL log' ) );
        $this->myLogger->useFiles(App::storagePath().'/logs/sql.log' );
    }

    /**
     * Handle the event.
     *
     * @param  illuminate.query  $event
     * @return void
     */
    public function handle($query, $bindings, $time, $name)
    {
            $data = compact( 'bindings', 'time', 'name' );
         
            // Format binding data for sql insertion
            foreach( $bindings as $i => $binding )
            {
                if( $binding instanceof \DateTime )
                {
                    $bindings[$i] = $binding->format( '\'Y-m-d H:i:s\'' );
                }
                else if( is_string( $binding ) )
                {
                    $bindings[$i] = "'$binding'";
                }
            }
         
            // Insert bindings into query
            $query = str_replace( array( '%', '?' ), array( '%%', '%s' ), $query );
            $query = vsprintf( $query, $bindings );
         
            $this->myLogger->info( $query, $data );
    }
}

 修改 EventServiceProvider.php

    protected $listen = [
        'App\Events\SomeEvent' => [
            'App\Listeners\EventListener',
        ],
        'illuminate.query' => [
            'App\Handlers\Events\QueryLogTracker',
        ],
    ];

 

--------------------------------------------2015/12/29 更新-------------------------------------------------

最新版laravel5.2放出后,上面的例子将不再实用。

首先已经没有了php artisan handler:event这个命令,其次也没有了“illuminate.query”这个字符串事件。

实现方法更新为以下:

1.先在类EventServiceProvider中注册事件监听

 

    protected $listen = [
        'App\Events\SomeEvent' => [
            'App\Listeners\EventListener',
        ],
        'Illuminate\Database\Events\QueryExecuted' => [
            'App\Listeners\QueryLogTracker',
        ],
    ];
 2.执行以下命令,添加未创建的事件和监听器

 

写道
php artisan event:generate

 

3.编辑类QueryLogTracker

<?php

namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Log\Writer;
use Monolog\Logger as Monolog;
use App;

class QueryLogTracker
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        $this->myLogger = new Writer( new Monolog( 'SQL log' ) );
        $this->myLogger->useDailyFiles(App::storagePath().'/logs/sql.log' );
    }

    /**
     * Handle the event.
     *
     * @param  QueryExecuted  $event
     * @return void
     */
    public function handle(QueryExecuted $event)
    {
            $sql = $event->sql;
            $time = $event->time;
            $bindings = $event->bindings;
            $name = $event->connectionName;
            $data = compact( 'bindings', 'time', 'name' );

            // Format binding data for sql insertion
            foreach( $bindings as $i => $binding )
            {
                if( $binding instanceof \DateTime )
                {
                    $bindings[$i] = $binding->format( '\'Y-m-d H:i:s\'' );
                }
                else if( is_string( $binding ) )
                {
                    $bindings[$i] = "'$binding'";
                }
            }

            // Insert bindings into query
            $query1 = str_replace( array( '%', '?' ), array( '%%', '%s' ), $sql );
            $query2 = vsprintf( $query1, $bindings );

            $this->myLogger->info( $query2.PHP_EOL, $data);
    }
}

 

分享到:
评论

相关推荐

    Laravel开发-laravel-sqlanywhere

    在本文中,我们将深入探讨如何在Laravel框架中使用SQL Anywhere数据库,基于标题"**Laravel开发-laravel-sqlanywhere**"和描述"**基于Sybase驱动程序的Laravel4雄辩模型与查询生成器**"。SQL Anywhere是Sybase公司...

    Laravel开发-laravel-sql-logger

    在Laravel中,数据库查询主要通过Eloquent ORM(对象关系映射)进行,所有查询都会被转换为SQL语句。默认情况下,Laravel不会自动记录每个SQL查询,但可以通过开启`DB::enableQueryLog()`来开启查询日志,然后通过`...

    Laravel开发-laravel-sqlserver

    在本文中,我们将深入探讨如何在 Laravel 框架中集成 SQL Server 数据库,特别是通过使用 ODBC 连接。Laravel 是一个流行的 PHP 框架,它为开发者提供了优雅的方式来构建 Web 应用程序。而 SQL Server 是 Microsoft ...

    Laravel开发-laravel-sql-logging

    "Laravel开发-laravel-sql-logging"是一个专门针对这个需求的Laravel 5包,它提供了更详细的SQL查询日志功能。 首先,了解Laravel框架自身的SQL日志机制。Laravel默认会记录所有执行的数据库查询,这些记录可以通过...

    Laravel开发-sql-logging

    在Laravel中,你可以通过`DB`门面或者`Eloquent`模型来执行SQL查询。每当你使用这些工具时,Laravel会自动记录查询。如果你想要手动控制日志,可以使用`DB::listen`方法注册一个回调函数,这个函数会在每个查询执行...

    Laravel开发-laravel5-sqlanywhere

    在本文中,我们将深入探讨如何在Laravel框架中使用SAP SQL Anywhere数据库。Laravel是一个流行的PHP框架,以其优雅的语法和强大的功能而受到开发者喜爱。SQL Anywhere是SAP公司提供的一款轻量级、可扩展的数据库系统...

    Laravel开发-sqlrelay

    在 Laravel 5.6.x 版本中,SQL Relay 通过 PDO 驱动程序被集成,为开发者提供了与 SQL Relay 交互的途径。 **1. SQL Relay 简介** SQL Relay 是一个用于管理数据库连接的软件,它能创建、管理和重用数据库连接,以...

    Laravel开发-codeception-sqlquery

    `Laravel开发-codeception-sqlquery` 模块则专门针对SQL查询进行了扩展,使得在Codeception测试中能够方便地对数据库操作进行断言,从而确保数据操作的正确性。 首先,让我们了解Codeception的基本概念。...

    Laravel开发-laravel-dblib-odbc-sqlserver

    在本文中,我们将深入探讨如何在 Laravel 开发环境中配置和使用 `laravel-dblib-odbc-sqlserver` 驱动,以便与 Microsoft SQL Server 数据库进行交互。Laravel 是一个流行的PHP框架,它提供了优雅的工具来构建高质量...

    laravel5使用freetds连接sql server的方法

    从安装必要的驱动和配置FreeTDS,到在Laravel中设置数据库连接,再到处理多数据库场景,希望这些步骤能够帮助开发者成功地集成Laravel与SQL Server。如果你在实践中遇到问题,可以进一步查阅文档或社区资源以获得...

    Oracle的SQL监视工具SQLTracker

    Oracle的SQL监视工具SQLTracker是一款强大的性能分析工具,专为数据库管理员和开发人员设计,用于诊断和优化SQL查询性能。这款工具在Oracle数据库环境中扮演着重要角色,它可以帮助用户实时监控SQL语句的执行情况,...

    laravel 获取某个查询的查询SQL语句方法

    在 Laravel 框架中,开发人员经常需要调试或优化数据库查询,以便了解查询的执行情况,例如查看生成的 SQL 语句、绑定参数以及查询的执行时间。本篇文章将详细讲解如何在 Laravel 中获取某个查询的 SQL 语句。 首先...

    Laravel开发-sql-dumper

    在Laravel框架中,SQL Dumper是一个非常实用的工具,它可以帮助开发者查看、记录和分析应用程序执行的SQL查询。在Laravel开发过程中,理解并掌握SQL Dumper的使用方法是提高开发效率和优化数据库性能的关键步骤。...

    laravel5全部代码

    7. **Eloquent ORM**:Laravel 的 Eloquent 提供了优雅的 ActiveRecord 风格的数据库操作,通过 Model 类映射数据库表,简化了 SQL 查询。 8. **中间件**:中间件可以处理请求和响应,比如认证、日志记录、CSRF ...

    用于记录laravel应用程序所有查询的dev工具

    标题中的“用于记录laravel应用程序所有查询的dev工具”指的是Laravel框架中的一款开发者工具,它的主要功能是记录和分析Laravel应用在运行过程中执行的所有数据库查询。在开发和优化阶段,这样的工具对于理解应用...

    laravel5 PHP框架中文翻译文档PDF版

    - **查询构造器**:介绍如何使用查询构造器执行复杂SQL语句。 - **Eloquent ORM**:深度解析Eloquent ORM的使用方法及其优势。 - **结构生成器**:描述如何使用结构生成器创建和修改数据库表。 - **迁移与数据填充**...

    切记:Laravel的查询缓存

    值得记住的是Laravel 5查询缓存 值得记住的是Laravel的口才,它增加了Remember remember()查询方法。 这使得在可调整的时间内缓存查询结果非常容易。 // Get a the first user's posts and remember them for a ...

    Laravel开发-l5-repository

    这样,业务逻辑可以依赖于Repository接口,而无需关心底层是如何实现数据访问的,可能是Eloquent ORM,也可能是SQL查询或第三方API。 2. **Andersao/L5-repository**:这是由Anders Aase开发的一个Laravel包,它为...

Global site tag (gtag.js) - Google Analytics