`

搞一个简单的数据打印工具AsDebug の Laravel

阅读更多

很多时候我们都要纠结于代码开发过程中的数据 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>

 

 

2
1
分享到:
评论
1 楼 vb2005xu 2016-01-20  
比如 对于 curl 调用就不再需要 加各种if 判断了,

$debugInfo = array(
					'request' => array(
							'method'	=> $method,
							'url'	=> $url,
							'headers'	=> $headers,
							'params'	=> $params,
						),
					'response' => $response,
				);
			AsDebug::dd($debugInfo, 'debug trace');

相关推荐

    Laravel开发-graphql-laravel-query-debug

    `rebing/graphql-laravel`是Laravel社区为Laravel框架创建的一个GraphQL实现,它使得在Laravel项目中集成GraphQL变得非常简单。这个包提供了完整的解决方案,包括解析器、验证、错误处理以及对Eloquent ORM的集成。 ...

    Laravel开发-debug

    它们会打印出变量的信息并终止脚本执行,`dd()`还会自动添加换行和颜色高亮,使数据更易读。 Laravel还引入了中间件(Middleware)的概念,可以通过自定义中间件来实现特定的调试行为,比如记录请求时间、检查权限...

    Laravel开发-mail-debug

    为了在不实际发送邮件的情况下测试邮件,Laravel提供了一个`pretend`选项。在`config/mail.php`中,将`pretend`设置为`true`,这将模拟邮件发送,实际上不会发送任何邮件,而是记录在日志中。 在调试过程中,你可能...

    laravel-query-logger:一种用于记录laravel应用程序所有查询的开发工具

    Laravel查询记录器 :memo: 一个开发工具,用于记录Laravel应用程序的所有查询。正在安装$ composer require overtrue/laravel-query-logger -vvv 当LOG_QUERY为true时,将启用Laravel查询记录器。用法$ tail -f ./...

    Laravel开发-laravel-console-debug

    Laravel通过`Log`类提供了一个统一的日志接口。默认情况下,日志会被写入到`storage/logs/laravel.log`文件。在命令行中,你可以使用`Log::debug()`方法来记录调试信息,例如: ```php Log::debug('这是调试信息'...

    Laravel开发-laravel-log-viewer 非常方便的页面 Log 查看工具

    在Laravel框架的开发过程中,日志记录是一个至关重要的部分,它帮助开发者追踪应用程序的运行状态、错误信息以及各种调试数据。`laravel-log-viewer`是一款专为Laravel设计的实用工具,它将日志内容以网页的形式展示...

    LaravelLogReader是Laravel的简易日志读取器和管理工具

    总的来说,Laravel Log Reader为Laravel开发者提供了一个强大的日志管理工具,它使得日志分析不再是一项繁琐的任务,而是变成了一个更加高效和直观的过程。通过合理使用此工具,开发者可以更好地理解应用程序的运行...

    Laravel开发-laravel-log

    为了分析日志数据,可以使用如Logstash、ELK (Elasticsearch, Logstash, Kibana)堆栈等工具,将日志数据导入到一个集中式日志管理系统,便于检索、分析和可视化。 10. **安全性** 虽然日志是调试的重要资源,但...

    Laravel开发-laravel-logviewer

    1. **用户友好的界面**:与查看纯文本日志文件相比,laravel-logviewer提供了一个整洁、易读的界面,使得日志分析更简单。 2. **日志级别过滤**:能够轻松切换不同级别的日志,专注于你需要的信息,避免被不重要的...

    Laravel开发-laravel-environments

    `laravel-environments`是一个专为Laravel设计的包,它使得管理这些环境变得更为简便。下面将详细探讨这个包的功能、使用方法以及在Laravel开发中的应用。 首先,Laravel的环境配置通常存储在`.env`文件中,该文件...

    Laravel开发-monosql

    总结来说,"Laravel开发-monosql"是一个非常实用的工具,它扩展了Laravel的Monolog功能,允许开发者将日志数据存储在MySQL数据库中,从而提供了更高级别的日志管理和分析能力。在开发过程中,合理地利用这个驱动,...

    Laravel开发-laravel-tracy

    在本文中,我们将深入探讨如何在 Laravel 开发中集成 `laravel-tracy`,这是一个将 Nette Tracy 调试器引入 Laravel 应用程序的工具。`Laravel` 是一个流行的 PHP 框架,它以其优雅的语法和丰富的功能而闻名。`Tracy...

    Laravel开发-laravel-log-viewer

    `laravel-log-viewer` 是一个专为Laravel设计的工具,用于方便地查看和管理应用程序的日志文件。这个开源项目通常作为一个独立的组件安装,能够以用户友好的界面显示存储在`storage/logs`目录下的日志信息。 ...

    Laravel开发-laravel-verbose

    在本文中,我们将深入探讨Laravel开发中的一个重要扩展——`laravel-verbose`。这个包是专门为Laravel和Lumen框架设计的,旨在增强内置控制台命令的功能,提供更丰富的详细信息,帮助开发者更好地理解和调试他们的...

    Laravel开发-laravel-graylog

    而Graylog是一个开源的日志管理和分析平台,它可以帮助我们收集、存储、搜索、分析以及可视化来自多个源的日志数据。 首先,了解集成Laravel与Graylog的重要性和好处是至关重要的。通过将Laravel应用的错误日志发送...

    Laravel开发-laravel-errors-views

    Laravel提供了一些工具帮助开发者进行错误检测和调试,如`dd()`函数快速打印变量内容,`dump()`配合`dd()`进行更详尽的数据检查,以及`Log`类进行日志记录。 ### 性能优化 为了提高用户体验,Laravel允许缓存错误...

    Laravel开发-laravel-papertrail

    `laravel-papertrail` 是一个专门为 Laravel 应用程序设计的日志通道,将 Laravel 的日志系统集成到 PaperTrail 服务中,这是一个云托管的日志管理平台,提供了实时日志查看、搜索、分析以及报警等功能。 **1. ...

    Laravel开发-laravel_expand

    Laravel是PHP世界里一个优雅且强大的Web应用开发框架,它提供了丰富的工具和功能,使得错误处理和调试变得更为简单。现在,让我们一起探索如何在Laravel中有效地进行错误管理。 首先,了解Laravel的异常处理机制至...

    Laravel开发-laravel-database-monologger

    在Laravel框架中,日志记录是至关重要的一个部分,它可以帮助开发者跟踪应用程序的状态,调试错误,以及在必要时提供详细的事务记录。`laravel-database-monologger` 是一个专门为Laravel 5.6设计的Monolog处理器,...

    Laravel开发-laravel-translations

    - 每个语言文件下都有一个PHP数组,如`messages.php`,其中包含了键值对,键是翻译的标识,值是对应的语言文本。 2. **翻译函数** - Laravel提供了`trans()`函数用于获取翻译文本,例如`trans('messages.welcome'...

Global site tag (gtag.js) - Google Analytics