SocketLog适合Ajax调试和API调试, 举一个常见的场景,用SocketLog来作微信调试, 咱们在作微信API开发的时候,若是API有bug,微信只提示“改公众帐号暂时没法提供服务,请稍候再试” ,咱们根本不知道API出来什么问题。 有了SocketLog就不同了, 咱们能够知道微信给API传递了哪些参数, 程序有错误咱们也能看见错误信息(下方有张图片,可能加载慢,请耐心等待一下)php
node server/index.js
, 将会在本地起一个websocket服务 ,监听端口是1229 。 若是想服务后台运行: nohup node server/index.js > /dev/null &
在本身的程序中发送日志:css
<?php include './php/SocketLog.class.php'; slog('hello world'); ?>
用slog函数发送日志, 支持多种日志类型:html
slog('msg','log'); //通常日志 slog('msg','error'); //错误日志 slog('msg','info'); //信息日志 slog('msg','warn'); //警告日志 slog('msg','trace');// 输入日志同时会打出调用栈 slog('msg','alert');//将日志以alert方式弹出 slog('msg','log','color:red;font-size:20px;');//自定义日志的样式,第三个参数为css样式
经过上面例子能够看出, slog函数支持三个参数:node
例如:咱们若是想将程序的报错信息页输出到console,能够配置mysql
<?php include './php/SocketLog.class.php'; slog(array( 'error_handler'=>true ),'set_config'); echo notice;//制造一个notice报错 slog('这里是输出的通常日志'); ?>
还支持其余配置项git
<?php include './php/SocketLog.class.php'; slog(array( 'host'=>'localhost',//websocket服务器地址,默认localhost 'port'=>'1229',//websocket服务器端口,默认端口是1229 'optimize'=>false,//是否显示利于优化的参数,若是运行时间,消耗内存等,默认为false 'show_included_files'=>false,//是否显示本次程序运行加载了哪些文件,默认为false 'error_handler'=>false,//是否接管程序错误,将程序错误显示在console中,默认为false 'force_client_id'=>'',//日志强制记录到配置的client_id,默认为空 'allow_client_ids'=>array()////限制容许读取日志的client_id,默认为空,表示全部人均可以得到日志。 ) ,'set_config'); ?>
[运行时间:0.081346035003662s][吞吐率:12.29req/s][内存消耗:346,910.45kb]
设置client_id后能实现如下功能:github
1,配置allow_client_ids 配置项,让指定的浏览器才能得到日志,这样就能够把调试代码带上线。 普通用户访问不会触发调试,不会发送日志。 开发人员访问就能看的调试日志, 这样利于找线上bug。 Client_ID 建议设置为姓名拼命加上随机字符串,这样若是有员工离职能够将其对应的client_id从配置项allow_client_ids中移除。 client_id除了姓名拼音,加上随机字符串的目的,以防别人根据你公司员工姓名猜想出client_id,获取线上的调试日志。web
设置allow_client_ids示例代码:sql
slog(array( 'allow_client_ids'=>array('luofei_zfH5NbLn','easy_DJq0z80H') ),'set_config')
2, 设置force_client_id配置项,让后台脚本也能输出日志到chrome。 网站有可能用了队列,一些业务逻辑经过后台脚本处理, 若是后台脚本须要调试,你也能够将日志打印到浏览器的console中, 固然后台脚本不和浏览器接触,不知道当前触发程序的是哪一个浏览器,因此咱们须要强制将日志打印到指定client_id的浏览器上面。 咱们在后台脚本中使用SocketLog时设置force_client_id 配置项指定要强制输出浏览器的client_id 便可。chrome
示例代码:
<?php include './php/SocketLog.class.php'; slog(array( 'force_client_id'=>'luofei_zfH5NbLn' ),'set_config'); slog('test'); `
用slog函数打印sql语句是,第二个参数传递为mysql或mysqli的对象便可。 示例代码:
$link=mysql_connect( 'localhost:3306' , 'root' , '123456' , true ) ; mysql_select_db('kuaijianli',$link); $sql="SELECT * FROM `user`"; slog($sql,$link);
后面会以OneThink为实例再对数据库调试进行演示。
经过上面的方法,socketlog还能自动为你检测没有where语句的sql操做,而后自动提示你。
网站调用了API ,如何将API程序的调试信息也打印到浏览器的console中? 前面咱们讲了一个配置 force_client_id, 能将日志强制记录到指定的浏览器。 用这种方式也能够将API的调试信息打印到console中,可是force_client_id 只能指定一个client_id, 若是咱们的开发环境是多人共用,这种方式就不方便了。 其实只要将浏览器传递给网站的User-Agent 再传递给API, API程序中不用配置force_client_id, 也能识别当前访问程序的浏览器, 将日志打印到当前访问程序的浏览器, 咱们须要将SDK代码稍微作一下修改。 调用API的SDK,通常是用curl写的,增长下面代码能够将浏览器的User-Agent传递到API 。
$headers=array(); if(isset($_SERVER['HTTP_USER_AGENT'])) { $headers[]='User-Agent: '.$_SERVER['HTTP_USER_AGENT']; } if(isset($_SERVER['HTTP_SOCKETLOG'])) { $headers[]='Socketlog: '.$_SERVER['HTTP_SOCKETLOG']; } curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
进入chrome浏览器的“工具”-->“扩展程序” , 点击SocketLog的“选项”进行设置。
有了SocketLog,咱们能很方便的分析开源程序,下面以OneThink为例, 你们能够在http://www.topthink.com/topic/2228.html 下载最新的OneThink程序。 安装好OneThink后,按下面步骤增长SocketLog程序。
编辑入口文件index.php, 再代码的最前面加载SocketLog.class.php ,并设置SocketLog
<?php include './SocketLog.class.php'; slog(array( 'error_handler'=>true, 'optimize'=>true, 'show_included_files'=>true ),'set_config');
编辑ThinkPHP/Library/Think/Db/Driver.class.php 文件,在这个类中的execute 方法为一个执行sql语句的方法,增长代码:
slog($this->queryStr,$this->_linkID);
类中的query方法也是一个执行sql语句的地方, 一样须要增长上面的代码
而后浏览网站看看效果:
经过console的日志,访问每一页咱们都知道程序干了什么,是一件很爽的事情。