`
weiqingfei
  • 浏览: 315426 次
  • 性别: 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开发-monitor

    "Laravel开发-monitor" 提供了一种有效的方式来监视日志文件,特别是"querys.log"和"laravel.log",这两个文件记录了数据库查询和框架的错误与调试信息。 "querys.log"文件包含了所有执行过的数据库查询,这对于...

    索引器:Laravel软件包,用于监视SELECT查询并提供最佳的INDEX字段

    Laravel Indexer监视页面上运行的SELECT查询,并允许将数据库索引动态添加到SELECT查询中。 然后在页面上直接显示EXPLAIN或MySQL执行计划的结果。 Indexer提供的结果将帮助您查看哪些索引最适合页面上运行的不同...

    laravel-tail-db:Artisan命令,用于监视由应用程序执行的实时SQL查询

    监视SQL查询。 在控制台中显示从应用程序执行的实时SQL查询。 优化SQL查询。 自动运行explain命令并输出到控制台。 检测缓慢SQL查询。 根据您的配置突出显示慢速SQL查询。 要求 PHP:^ 7.0 Laravel:〜5.5,〜5.6...

    Laravel开发-df-azure

    在“Laravel开发-df-azure”这个项目中,我们聚焦于将Laravel与Microsoft Azure云服务相结合,充分利用两者的优势来构建高效、可扩展的Web应用程序。 DreamFactory是一个开源API管理和后端服务平台,它允许开发者...

    Laravel开发-pg-web-stats

    它为开发者提供了一种直观的方式来监视和优化PostgreSQL数据库的性能,是数据库管理中的一个宝贵工具。通过理解和使用这个项目,开发者不仅可以提升数据库管理技能,还能深入理解Laravel框架的工作原理。

    最新PHP及MySQL进阶教程

    5. **性能优化**:索引策略、查询优化、EXPLAIN分析,以及如何使用MySQL性能监视工具。 6. **分区与分片**:在大数据场景下的数据库设计策略。 7. **MySQL复制与集群**:实现高可用性和数据冗余的解决方案。 8. **...

    strength-laravel:webデザイン版str

    ##使用言语,フレームワークlaravel,vue,html,css,sql ##使い方1.一覧画面(みんなの记录):记录一覧画面。ダンベルのイラストと数字はいいね机能です。 2.个人一覧画面:カレンダーに,自分が投稿した日がチ...

    Coinwink:加密警报,监视列表和投资组合跟踪应用

    加密警报,监视列表和投资组合跟踪应用 于2016年首次构建为WordPress网络应用程序,即使现在它仍可在同一堆栈上运行。 虽然很想切换到Laravel + Vue,但当前的WP + jQuery堆栈运行良好。 它快速,安全,相对易于...

    core-php-admin-panel-master_crud_organizationaeg_php_

    管理员面板是Web应用的一部分,专为系统管理员设计,用于监视、维护和配置系统设置。"Core PHP Admin Panel"提供了一个图形界面,允许管理员执行各种管理任务,如用户管理、数据管理、设置管理和权限分配等。 5. *...

    PAMS

    8. **性能监视工具**:如New Relic、Blackfire.io等,它们提供深入的性能洞察,包括页面加载时间、SQL查询性能等。 9. **PHP版本升级**:随着PHP版本的更新,新版本通常会带来性能提升,保持版本更新是提高性能的一...

Global site tag (gtag.js) - Google Analytics