PHP代码调试与日志

PHP代码调试与日志

(原创内容,转载请注明来源,谢谢)

一、代码调试

由于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录制过程,并将结果导出进行压测。这些工具具体用到的时候查看官方文档即可。

——written by linhxx 217.08.17

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏k8s

k8s-组件-apiserver

K8s-apiserver组件是k8s集群核心组件,所有其他组件均需要与apiserver进行交互。apiserver提供rest服务,并对k8s资源进行操作。

3372
来自专栏Ken的杂谈

单点登录(SSO)的设计与实现

SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。https://baike....

983
来自专栏技术/开源

开源API测试工具 Hitchhiker v0.5更新 - 完善细节

Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部...

1708
来自专栏乐百川的学习频道

scrapy 进阶使用

前段时间我写了一篇《scrapy快速入门》,简单介绍了一点scrapy的知识。最近我的搬瓦工让墙了,而且我又学了一点mongodb的知识,所以这次就来介绍一些s...

3457
来自专栏菩提树下的杨过

rpc框架之 thrift 学习 1 - 安装 及 hello world

thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:htt...

2369
来自专栏烂笔头

Python爬虫代理IP池

目录[-] 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速...

4376
来自专栏乐沙弥的世界

Linux 6 下安装 tomcat 8

963
来自专栏Java技术

Tomcat服务器顶层结构和启动过程

通过从部署的 1240 个 JVM 中得到的数据,我们能够确定出现了 862 个容器供应商,或者说是占到了运行环境的 70% 左右。这些容器的供应商分布如下:

652
来自专栏龚军的专栏

Docker registry工作机制简介

Docker registry是存储docker image的仓库,本文通过对Docker registry的介绍,让大家更进一步了解Docker regist...

4810
来自专栏菩提树下的杨过

ZooKeeper 笔记(3) 实战应用之【统一配置管理】

大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传、下载时,各子应用都会访问公用的Ftp服务器。如果...

3655

扫码关注云+社区