mysql debug log_PHP代码调试与日志
封面.jpg
一、代码调试
由于PHP很少有类似java、.NET的断点调试工具,因此通常都是要采用输出中间结果的方式进行调试,主要如下:
1、var_dump
对于可以直接打印的(如在controller层、view层),则使用此方法进行打印。对于controller,如果是调用的ajax,要用此方法打印还要配合firebug等浏览器调试工具。
2、error_log
当无法直接在浏览器输出调试结果时(大部分情况,如service、dao等),则采用此方式,可以将需要监视的变量打log,并在linux上用tail -f logfile查看日志最新的信息。
3、debug_zval_dump
该函数打印的变量不仅有值,还有其被引用的次数。因此当涉及到变量的引用传参时,采用此方式可以查看引用传参是否正确。
4、debug_print_backtrace
该函数功能强大,在某个方法里面执行该函数,可以逐级查看该函数所在方法的调用点,即会返回执行该函数所在方法的方法即执行文件名,并返回调用其的文件名。正如函数名backtrace,其会一路追溯直至找到初始调用点。
5、firebug
对于前端调试,采用火狐浏览器,安装firebug插件,功能强大。其可以调试js、css,对js设置断点,打印中间变量;对css的各类样式,可以实时调整并查看结果,不用每次改个数值再刷新页面,只要将最终状态的代码复制到真实代码即可。
6、fiddler
对于手机app的调试,当需要知道其url,则可以通过fiddler进行抓包。
二、日志查看
1、PHP日志
在php.ini文件中,将log_errors设置成on,并且设置其loglevel,可以设置成php的十多种错误类型的某些种,再设置error_log的文件路径。这样,当php运行期间发生的错误,会记录错误日志,便于定为原因。
2、Apache日志
Apache默认开启错误日志,在httpd.conf里面进行配置,如下:
ErrorLog“Logs/error.log”
CustomLog“Logs/access.Log” common
其中,errorlog是错误日志,主要内容包括错误日期时间、错误的等级、导致错误的ip、信息具体内容。
cumstomlog是访问日志,日志包括发送请求的服务器ip、服务器完成请求处理的时间、客户端发出的请求行、服务器状态码、返回给客户端的不包括响应头的字节数。
3、Nginx日志
Nginx错误日志在.conf配置文件中,可以定义在main区块或者虚拟主机的配置文件中,定义方法如下:
error_logpath/to/file/error.log error_level;
错误级别有8种,级别越高则记录的日志内容越少。
和apache类似,nginx也有访问日志的记录。
4、mysql日志
mysql分为4种日志:错误日志、二进制日志、查询日志和慢查询日志。
1)错误日志
默认文件名是hostname.err,放在DATADIR目录。当mysql无法启动,或者其他情况下服务器报错,可以从这里进行查看。
日志文件是文本文件,可以直接打开。
2)二进制日志
二进制日志包含所有的对数据库数据的更新或者潜在更新,包括所有的DDL语句,以及DML语句中的增删改。
文件是二进制文件,无法直接打开,可以用mysql提供的mysqlbinlog查看。查看方式:mysqlbinlog 文件名。
日志中记录了完整的操作的sql语句,以及操作时间,以便分析定位。
3)查询日志
通过配置文件配置Log选项启用,方法如下:
Log= ‘/path/to/logfile.log’
由于该配置会将每一条sql的语句都记录,因此通常文件会很大,只适合在开发、测试期间本地开启,而线上通常不开启此功能。
4)慢查询日志
在配置文件中可以定义慢查询的时间,即sql执行的时间超过配置的时间,被定义为慢查询,会记录相应的log。配置方法如下:
Log-slo-queries=’/path/to/logfile.log’
long_query_time=second
上述第一行是配置日志的记录位置,第二行是记录时间,单位是秒,如second写的是1,则执行超过1秒的sql都会被当作慢查询。
慢查询的定位对于问题排查、性能优化具有重要作用,因此线上通常会开启,并且每天需要查看是否有慢查询,并且在业务许可的情况下对sql或者调用的代码进行优化。
三、单元测试
单元测试又称为模块测试,是对代码中最小的部分(即方法)进行测试。由于大部分的逻辑都放在service,因此通常只对service进行单元测试。
PHP的单元测试有一个优秀的单元测试工具,PHPUnit,其可以很方便的对代码进行单元测试,并且可以将结果输出,查看单元测试的代码覆盖率、单元测试成功率等内容。
1、断言(assert)
单元测试中,一个很重要的内容叫做断言,命令是assert()。关于断言,phpunit提供了非常多的断言方式,涵盖true、false、非空、空、count、等于、大于、小于、null等诸多内容,具体可以查看phpunit官方文档。
断言是用来判断单元测试中,方法的执行结果是否符合预期的重要依据。
2、桩(stub、mock)
单元测试的基本原则是模块化,因此对某个方法的单元测试,如果方法里面还有调用其它类的方法,则是默认那些方法都要返回期望的结果。即,对方法的单元测试,不依赖于其他方法。
因此,需要对其他的调用方法进行加桩操作。可以理解为利用phpunit提供的mock函数,将执行调用其他类的那一行命令替换掉,直接返回需要的结果。
但是,对于本类内部的方法调用、对于所有的常量、静态方法、静态变量的调用,则无法加桩。
3、代码覆盖率
通常,单元测试要求代码覆盖率尽量在100%,即如果里面有if、elseif、else条件,或者switch、case语句,需要把其中的每一项都测试过去,确保每种情况下的代码都是正常运行的。为了实现此方法,数据供给器(dataprovider)是phpunit提供的一个很好的模块。
四、压力测试
对于压力测试,可以采用ab、jmeter对代码进行压测,采用mysqlslap、jmeter对mysql进行压测,采用jmeter+badboy录制过程,并将结果导出进行压测。这些工具具体用到的时候查看官方文档即可。
mysql debug log_PHP代码调试与日志相关推荐
- DEBUG 代码调试
目录 1 常用调试指令 2 查看变量 ①在Variable栏:右键-->+New Watch添加一个变量,可以对变量进行持续监控 ②代码栏:右键-->Evaluate Expression ...
- Eclipse中如何调试(Debug)代码
目录 1.设置断点 2.执行调试 3.单步调试 4.如何返回原来的视图? 5.如何结束调试程序 调试又称为debug,为什么调试称为debug呢?据说是在当时有一只虫子跑进了计算机中导致机器宕机,因为 ...
- 【VS实践】代码调试与错误处理
程序员的装逼技能:调试,错误处理和快捷键 学计算机3年,只知道一些基础的理论知识,写代码和调试很差,基本不会什么吧! 花时间了解一下关于这块的东西!以前觉得调试就是代码写出来一运行,有问题了分析那里出 ...
- Python代码调试方法
对于每个程序开发者来说,调试几乎是必备技能.常用Pycharm编辑器里的方法有Print大法.log大法,但缺少类似Matlab的变量区,给代码调试带来不便,特别是在有函数的情况下,变量无法实时查看. ...
- python 如何边改代码边调试_Python 代码调试神器:PySnooper
给大家推荐本我自己写的电子书<PyCharm中文指南>,把各种 PyCharm 的高效的使用技巧用GIF动态图的形式展示出来.有兴趣的可以看它的在线文档: http://pycharm.i ...
- python 除数不能为零的报错有哪些_【社区精选40】Python错误处理及代码调试方法(文末赠书中奖名单)...
本文整理自爱数据学院中的问答 更多精彩问答,进入下方社区网站查看 http://www.lovedata.cn/invitation 社区精选话题 第40期 Python错误处理及代码调试方法 一次写 ...
- python示例异常处理与程序调试_Python错误处理及代码调试方
一次写完代码程序并能够正常运行的概率很小很小,总会有各种各样的错误bug需要处理.有的报错简单,看看报错信息简单修改一下就可以了. 但是有的报错很复杂,特别是一些复杂长代码,需要我们定位到错误的位置, ...
- idea远程Debug,远程调试
如果需要进行测试直接跳到第三步进行设置就可以 idea远程Debug,远程调试 一.为什么使用远程Debug 二.搭建项目 1.项目配置 2.打包项目 三.Debug测试 1.创建链接 2.启动项目 ...
- 在MySQL内部存储代码
概述 MySQL允许通过触发器.存储过程.函数的形式来存储代码.从5.1开始,还可以在定时任务中存放代码,这个定时任务也称为事件.存储过程和存储函数都被统称为存储程序.这四种存储代码都使用特殊的SQL ...
最新文章
- Python内置函数eval
- java学习笔记(十一)基本数据类型的对象包装类
- 现代软件工程讲义 8 软件的血型
- 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
- python中outside loop_Python入门指引
- mysql判断是否包含某个字符的方法
- CentOS 7 使用yum安装出现错误
- 应用机器学习(六):决策树
- Android 开机第一帧制作、开关机动画制作、壁纸添加
- slam是什么意思?一文带你读懂SLAM
- TuX2:用于机器学习的分布式图计算
- 实用的Android ui分析工具
- Java 五子棋(一)绘制棋盘、棋子
- oracle 查找索引大小写,关于sql:Oracle中不区分大小写的搜索
- win10打开word时候报错,应用程序无法正常启动:0xc0000142
- Winsock套接字开发网络聊天室实例(C/S)模式
- 手机电子邮件用outlook登录
- Zblog教程-Zblog网站安装教程-Zblog网站搭建教程
- 黑马程序员_java开发前缀
- 日益4月招投奖励活动颁布
热门文章
- u8 和 char如何转化_EXCEL小知识——如何快速实现文本与数值的互相转化
- java 搜索引擎 关键词高亮_和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮(示例代码)...
- #if 0 #elif 1 #else #endif 用法
- P1272 重建道路
- WCF学习之旅—实现支持REST客户端应用(二十四)
- 关于计算机类课程实验教学的思考
- 远程调试tomcat
- 服务器主板稳定,服务器主板
- Android对性能要求,Android性能管理
- 工业机器人专业展板图片_南充职业技术学院工业机器人专业线下课程开展情况...