很多时候我们都要纠结于代码开发过程中的数据 dump 工作,诸如 接口测试,程序调错,不得不在代码行中加入各种 echo,dump,exit 等等操作,每次我们都需要在代码里面不停的加,然后调试完了再去删,下次有问题,还是这么琐碎的去做,是不是很麻烦,为此 终于下定决心来实现一个不再需要这么蛋比的工具了.
实现思路很简单,使用 url 参数控制是否启用内容打印服务,根据标签过滤打印的内容,让不同的开发者可以独立进行内容测试.
分成2组文件
1. 后端文件
<?php /** * 数据调试 操作类 * * 使用简单的方式来打印脚本运行过程中的请求过程 * * @author vb2005xu@qq.com */ class AsDebug { private $disable = true; private function __construct() { $this->url = Request::fullUrl(); if ( function_exists('getallheaders') ) { $this->headers['request'] = getallheaders(); } else { $this->headers['request'] = self::emu_getallheaders(); } $this->headers['response'] = headers_list(); $this->cookies = isset($_COOKIE) ? $_COOKIE : array(); $this->sessions = isset($_SESSION) ? $_SESSION : array(); $this->servers = isset($_SERVER) ? $_SERVER : array(); $this->items = []; $disable = Input::get('asdebug'); if ( $disable == ' vb2005xu@qq.com' ) { $this->disable = false; } $this->tag = Input::get('asdebug-tag',''); $path = storage_path() . '/asdebug'; if ( !is_dir($path) ){ mkdir($path, 0700, true); } $this->filename = $path . '/log-' . md5($this->tag) . '.txt'; } function __destruct() { // 进行资源释放 if ( $this->disable ) return; $data = array( 'url' => $this->url, 'headers' => $this->headers, 'cookies' => $this->cookies, 'sessions' => $this->sessions, // 'servers' => $this->servers, 'items' => $this->items, 'cretae_at' => time(), ); $id = md5( $data['url'] . $data['cretae_at'] ); $data = json_encode( array( 'id' => $id, 'tag' => $this->tag, 'content' => $this->output($data) ) ); file_put_contents($this->filename, $data); } private static function emu_getallheaders() { foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); $headers[$name] = $value; } else if ($name == "CONTENT_TYPE") { $headers["Content-Type"] = $value; } else if ($name == "CONTENT_LENGTH") { $headers["Content-Length"] = $value; } } return $headers; } public static function instance() { static $self = null; if ( is_null($self) ) $self = new self; return $self; } public function getContent() { if ( is_readable($this->filename) ) { $json = file_get_contents($this->filename); if ( !empty($json) ) { $data = json_decode($json, true); if ( $data['tag'] == $this->tag) { return $json; } } } return '{}'; } public function isEnable() { return !$this->disable; } public function getTag() { return $this->tag; } public function disable($disable=false) { $this->disable = $disable; } private function write($vars, $label = '') { if ( $this->disable ) return; $this->items[] = array( 'label' => $label, 'vars' => $vars, ); } private function output($vars, $label = '') { $content = "<pre>\n"; if ($label != '') { $content .= "<strong>{$label} :</strong>\n"; } $content .= htmlspecialchars(print_r($vars, true), ENT_COMPAT | ENT_IGNORE); $content .= "\n</pre>\n"; return $content; } public static function dd($vars, $label = '') { self::instance()->write($vars, $label); } public static function ddexit($vars, $label = '') { self::instance()->write($vars, $label); exit; } public static function view() { self::instance()->disable(true); return self::instance()->getContent(); } }
在某个控制器中加入一个action
public function asdebug() { $f = Input::get('f'); if ( $f == 'json' ) { return AsDebug::view(); } return $this->view('asdebug'); }
做一个简单的视图文件
<?php $this->extend('_layouts/master'); ?> <?php $this->block('js-after');?> <script> var ids = {}; var calc_num = 0; function setContent(json) { if ( !json.id ) return; var id = json.id; if ( ids[ id ] ) return; ids[ id ] = 1; calc_num ++; $('#v-asdebug').prepend('<p> 编号: ' + calc_num + '<br>' + json.content + '</p><hr>'); if ( calc_num == 500 ) { calc_num = 0;ids = {}; } } function refresh() { $.getJSON( '<?php echo URL::route('asdebug')?>', {f: 'json', 'asdebug-tag': '<?php echo Input::get("asdebug-tag")?>'}, function(json){ setContent(json); setTimeout('refresh()',3000); } ); } refresh(); </script> <?php $this->endblock();?> <?php $this->block('content');?> <div> <div class="main-content-title"> <div class="float-left"> <h2 class="">asdebug 调试工具</h2> </div> </div> <div class="main-content-body" id="v-asdebug"> </div> </div> <?php $this->endblock();?>
在全局视图文件中加入,实现页面中异步的ajax请求也能自动使用 asdebug 功能进行数据记录:
<?php if ( AsDebug::instance()->isEnable() ):?> <script type="text/javascript"> $.ajaxSetup({data: { 'asdebug': '<?php echo Input::get("asdebug")?>', 'asdebug-tag': '<?php echo Input::get("asdebug-tag");?>' }}); $(document).ready(function(){ var ss = 'asdebug=<?php echo Input::get("asdebug")?>&asdebug-tag=<?php echo Input::get("asdebug-tag");?>'; $('a').each(function(){ var url = $(this).attr('href'); if ( '' != url ) { var pieces = url.split("?"); url = pieces[0] + '?' + ss; if ( pieces.length > 1 ) { url += '&' + pieces[1]; } $(this).attr('href', url); } }); }); </script> <?php endif;?>
此处代码中可能包含部分 laravel 的代码,但是很容易移植到其它的框架中,希望对大家有所帮助.
此工具解决了 线上,线下代码 dump的问题
此处简单修正下 定时器的小问题,当网络请求失败后,会停止,此处解决此小问题
<script src="//cdn.bootcss.com/jquery/1.11.2/jquery.js"></script> <script> var ids = {}; var calc_num = 0; var ii = 0; function setContent(json) { console.log(++ii); if ( !json.id ) return; var id = json.id; if ( ids[ id ] ) return; ids[ id ] = 1; calc_num ++; $('#v-asdebug').prepend('<p>[' + calc_num + '] ' + json.create_at +'<br>' + json.content + '</p><hr>'); if ( calc_num == 500 ) { calc_num = 0;ids = {}; } } function refresh() { $.ajax('http://dev.duixueren.net/asdebug.html',{ type: 'GET', dataType: 'json', data: {f: 'json', 'asdebug-tag': '123'}, async: false, cache: false, error: function (xhr, status, et) { console.warn(status, et); }, complete: function (xhr, status, et) { setTimeout('refresh()',500); }, success: function(json, status, xhr){ setContent(json); } }); } $(document).ready(function(){ refresh(); }); </script> <div> <div class="main-content-title"> <div class="float-left"> <h2 class="">asdebug 调试工具</h2> </div> </div> <div class="main-content-body" id="v-asdebug"> </div> </div>
相关推荐
`rebing/graphql-laravel`是Laravel社区为Laravel框架创建的一个GraphQL实现,它使得在Laravel项目中集成GraphQL变得非常简单。这个包提供了完整的解决方案,包括解析器、验证、错误处理以及对Eloquent ORM的集成。 ...
它们会打印出变量的信息并终止脚本执行,`dd()`还会自动添加换行和颜色高亮,使数据更易读。 Laravel还引入了中间件(Middleware)的概念,可以通过自定义中间件来实现特定的调试行为,比如记录请求时间、检查权限...
为了在不实际发送邮件的情况下测试邮件,Laravel提供了一个`pretend`选项。在`config/mail.php`中,将`pretend`设置为`true`,这将模拟邮件发送,实际上不会发送任何邮件,而是记录在日志中。 在调试过程中,你可能...
Laravel查询记录器 :memo: 一个开发工具,用于记录Laravel应用程序的所有查询。正在安装$ composer require overtrue/laravel-query-logger -vvv 当LOG_QUERY为true时,将启用Laravel查询记录器。用法$ tail -f ./...
Laravel通过`Log`类提供了一个统一的日志接口。默认情况下,日志会被写入到`storage/logs/laravel.log`文件。在命令行中,你可以使用`Log::debug()`方法来记录调试信息,例如: ```php Log::debug('这是调试信息'...
在Laravel框架的开发过程中,日志记录是一个至关重要的部分,它帮助开发者追踪应用程序的运行状态、错误信息以及各种调试数据。`laravel-log-viewer`是一款专为Laravel设计的实用工具,它将日志内容以网页的形式展示...
总的来说,Laravel Log Reader为Laravel开发者提供了一个强大的日志管理工具,它使得日志分析不再是一项繁琐的任务,而是变成了一个更加高效和直观的过程。通过合理使用此工具,开发者可以更好地理解应用程序的运行...
为了分析日志数据,可以使用如Logstash、ELK (Elasticsearch, Logstash, Kibana)堆栈等工具,将日志数据导入到一个集中式日志管理系统,便于检索、分析和可视化。 10. **安全性** 虽然日志是调试的重要资源,但...
1. **用户友好的界面**:与查看纯文本日志文件相比,laravel-logviewer提供了一个整洁、易读的界面,使得日志分析更简单。 2. **日志级别过滤**:能够轻松切换不同级别的日志,专注于你需要的信息,避免被不重要的...
`laravel-environments`是一个专为Laravel设计的包,它使得管理这些环境变得更为简便。下面将详细探讨这个包的功能、使用方法以及在Laravel开发中的应用。 首先,Laravel的环境配置通常存储在`.env`文件中,该文件...
总结来说,"Laravel开发-monosql"是一个非常实用的工具,它扩展了Laravel的Monolog功能,允许开发者将日志数据存储在MySQL数据库中,从而提供了更高级别的日志管理和分析能力。在开发过程中,合理地利用这个驱动,...
在本文中,我们将深入探讨如何在 Laravel 开发中集成 `laravel-tracy`,这是一个将 Nette Tracy 调试器引入 Laravel 应用程序的工具。`Laravel` 是一个流行的 PHP 框架,它以其优雅的语法和丰富的功能而闻名。`Tracy...
`laravel-log-viewer` 是一个专为Laravel设计的工具,用于方便地查看和管理应用程序的日志文件。这个开源项目通常作为一个独立的组件安装,能够以用户友好的界面显示存储在`storage/logs`目录下的日志信息。 ...
在本文中,我们将深入探讨Laravel开发中的一个重要扩展——`laravel-verbose`。这个包是专门为Laravel和Lumen框架设计的,旨在增强内置控制台命令的功能,提供更丰富的详细信息,帮助开发者更好地理解和调试他们的...
而Graylog是一个开源的日志管理和分析平台,它可以帮助我们收集、存储、搜索、分析以及可视化来自多个源的日志数据。 首先,了解集成Laravel与Graylog的重要性和好处是至关重要的。通过将Laravel应用的错误日志发送...
Laravel提供了一些工具帮助开发者进行错误检测和调试,如`dd()`函数快速打印变量内容,`dump()`配合`dd()`进行更详尽的数据检查,以及`Log`类进行日志记录。 ### 性能优化 为了提高用户体验,Laravel允许缓存错误...
`laravel-papertrail` 是一个专门为 Laravel 应用程序设计的日志通道,将 Laravel 的日志系统集成到 PaperTrail 服务中,这是一个云托管的日志管理平台,提供了实时日志查看、搜索、分析以及报警等功能。 **1. ...
Laravel是PHP世界里一个优雅且强大的Web应用开发框架,它提供了丰富的工具和功能,使得错误处理和调试变得更为简单。现在,让我们一起探索如何在Laravel中有效地进行错误管理。 首先,了解Laravel的异常处理机制至...
在Laravel框架中,日志记录是至关重要的一个部分,它可以帮助开发者跟踪应用程序的状态,调试错误,以及在必要时提供详细的事务记录。`laravel-database-monologger` 是一个专门为Laravel 5.6设计的Monolog处理器,...
- 每个语言文件下都有一个PHP数组,如`messages.php`,其中包含了键值对,键是翻译的标识,值是对应的语言文本。 2. **翻译函数** - Laravel提供了`trans()`函数用于获取翻译文本,例如`trans('messages.welcome'...