php调试排错技巧大全

article/2025/9/28 19:34:57

做php开发时间不短了,在这里总结下平时常用的调试方法,希望对大家有所帮助。

1 代码调试

1.1 打印输出

使用echo、var_dump 、print_r等方法在需要调试地方进行打印输出,通过输出特定变量的值可以判断程序执行是否正确。

1.2 使用debug_backtrace 函数打印调用栈信息:

debug_print_backtrace();exit;

#0  cli_rakuten->getOrders(1)
#1  call_user_func_array(Array ([0] => cli_rakuten Object (),[1] => getOrders), Array ([0] => 1)) called at [/data/project/***/include/of/of.php:79]
#2  of::cliDispatch(cli_rakuten, getOrders, 1, Array ([0] => 1)) called at [/data/project/***/cli.php:17]

1.3 使用xdebug调试代码

PHP xdebug 调试工具安装与使用

Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。

配置好phpstorm+xdebug后,可很方便的对代码进行断点调试:

除了生成调用栈信息外,xdebug还能生成性能分析报告,windows上可使用WinCacheGrind来查看性能分析报告。

1.4 使用xhprof调试分析代码

XHProf是facebook 开发的一个测试php性能的扩展。

对于本地开发环境来说,进行性能分析xdebug是够用了,但如果是线上环境的话,xdebug消耗较大,配置也不够灵活,因此线上环境建议使用xhprof进行PHP性能追踪及分析。

xhprof安装很简单,可直接去搜索安装文档。

在代码中加入生成xhprof分析报告代码:

xhprof_enable(XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,['ignored_functions'    => ['call_user_func','call_user_func_array']]);//这里是业务代码
//...$xhprofData = xhprof_disable();
require '/data/soft/xhprof/xhprof_lib/utils/xhprof_lib.php';
require '/data/soft/xhprof/xhprof_lib/utils/xhprof_runs.php';
$xhprofRuns = new XHProfRuns_Default();
$runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');
echo 'http://192.168.52.129:8888/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test'.PHP_EOL;

查看报告:

图形报告:

 

2 日志分析

log日志,通常是系统或软件、应用的运行记录。通过log的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用log足够丰富,也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息;如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状况,及时发现问题并快速定位、解决问题,补救损失。

2.1 PHP日志

2.1.1 php错误日志

php错误日志可在配置文件php.ini中设置:

log_errors = On

error_log = /var/log/php-fpm/php_errors.log

也可在php-fpm配置文件php-fpm.conf中设置:

php-fpm进程日志,记录php-fpm进程相关日志信息

error_log = /var/log/php-fpm/error.log

php-fpm.conf中也可以设置错误日志,会覆盖掉php.ini中的相关设置

php_admin_value[error_log] = /var/log/php-fpm/www-error.log

php_admin_flag[log_errors] = on

2.1.2 php慢日志

slowlog = /var/log/php-fpm/www-slow.log

#执行时间超过request_slowlog_timeout 设置时间将会记录到slowlog中

request_slowlog_timeout = 1s

慢日志文件中会记录执行时间较长的函数信息:

[19-Sep-2018 11:00:55] [pool www] pid 80603

script_filename = /data/project/test//slow.php

[0x00007f4e0a7ed568] sleep() /data/project/test/slow.php:5

2.2 业务日志

php内置error_log、syslog函数功能强大且性能极好,但由于各种缺陷(error_log无错误级别、无固定格式,syslog不分模块、与系统日志混合),灵活度降低了很多,不能满足应用需求。

当然我们可以自己封装实现一个符合PHP PSR-3 日志接口规范 所要求的模块、级别、清晰、易用等特点的日志库,但通常不建议这样做,因为已经有一些非常好的第三方日志库了,我们可直接用。

这里挑选3款应用比较广的日志库进行比较:

log4php

文档:http://logging.apache.org/log4php/quickstart.html

log4php是apche组织维护项目,是log4xx系列日志组件之一,log4j在JAVA中可算是大名鼎鼎的日志开发包。log4php也作为一个单独的子项目存在,可以很方便的加载使用。

优点:

最为著名、设计精良、格式完美、文档完善、功能强大、扩展方便

缺点:

只支持TRACE、DEBUG、INFO、WARN、ERROR、FATAL共6个日志级别,不完全符合psr-3日志规范
停止维护了,目前最新版本还是更新于2012-12-13日v2.3.0
性能较差

Monolog

github地址:https://github.com/Seldaek/monolog

使用方法:https://www.jianshu.com/p/59ce6d70f801

Monolog是一款强大的日志处理类库,应用非常广泛,目前有包括Symfony 、Laravel、 CakePHP、YII等诸多知名php框架都内置了Monolog。Monolog可以发送你的日志到文件、到sockets、到邮箱、到数据库或(和)者其他网路存储服务(云)。这里用了,因为Monolog的确可以做到同时保存到一个或多个存储介质。

优点:

功能强大、应用广泛、安装方便、设计优秀,使用灵活、扩展方便、更新活跃

缺点:性能较差

SeasLog

github地址:https://github.com/Neeke/SeasLog

使用方法:https://blog.csdn.net/u011120720/article/details/51474488

SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便、规范、高效地写日志,以及快速地读取和查询日志。

优点:高性能、功能完善

缺点:

安装配置较麻烦,如编译PHP扩展

扩展不方便

比较

从功能上比较:

Monolog > SeasLog > log4php

从性能上比较:

SeasLog > Monolog > log4php

3 进程跟踪

3.1 使用lsof查看进程打开的文件句柄

Linux平台提供了lsof工具可以查看某个进程打开的文件句柄,可以用于跟踪进程所有打开的socket、file、资源。

lsof -p 2901

3.2 使用strace跟踪进程中的系统调用

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

跟踪可执行程序:

strace -T -tt -s 512 php /data/project/***/cli.php test

跟踪服务程序

strace -T -tt -s 512 -p 1123

默认返回的结果每一行代表一条系统调用,规则为“系统调用的函数名及其参数=函数返回值”。

3.3 gdb调试php进程

一般的php问题通过以上的这些方法排查出来了。但还有死循环、进程异常退出等问题可通过gdb分析core dump文件来排查原因。

//修改core file size
ulimit -c unlimited

//修改core dump文件生成位置
echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern

//用gdb调试core dump文件
gdb php -c core.31656
 

4 网络抓包

4.1 使用tcpdump抓包

在调试网络通信程序是tcpdump是必备工具。tcpdump很强大,可以看到网络通信的每个细节。如TCP,可以看到3次握手,PUSH/ACK数据推送,close4次挥手,全部细节。包括每一次网络收包的字节数,时间等。

tcpdump -i any tcp port 80  

  • 18:01:37.968224 时间带有精确到微妙
  • 192.168.52.1.64504 > T1.http 表示通信的流向,64504是客户端,T1.http是服务器端80端口
  • [S] 表示这是一个SYN请求
  • [.] 表示这是一个ACK确认包,(client)SYN->(server)SYN->(client)ACK 就是3次握手过程
  • [P] 表示这个是一个数据推送,可以是从服务器端向客户端推送,也可以从客户端向服务器端推
  • [F] 表示这是一个FIN包,是关闭连接操作,client/server都有可能发起
  • [R] 表示这是一个RST包,与F包作用相同,但RST表示连接关闭时,仍然有数据未被处理。可以理解为是强制切断连接
  • win 2053是指滑动窗口大小
  • length 7300指数据包的大小

4.2 使用ngrep抓包

tcpdump能抓到网络通信细节,但如果只想看传输的数据等简单信息可以用ngrep命令

ngrep -pqt -W byline port 80 -d ens33

 


http://chatgpt.dhexx.cn/article/d5QXbL96.shtml

相关文章

VSCode+wampserver搭建PHP调试环境

1.下载vscode和wampserver Vscode下载地址: https://code.visualstudio.com/ Wampserver下载地址: https://www.wampserver.com/en/#download-wrapper 2.测试wampserver是否安装成功 双击打开WAMP,会在右下角的任务栏看到它的图标,如果是绿色代表OK, 其…

vscode使用xdebug3进行PHP调试

使用xdebug: 下载 Xdebug: Downloads 或在这里输入PHP的信息给出推荐的版本:Xdebug: Support — Tailored Installation Instructions 配置: 打开php.ini文件,在文件最后添加:(3.0的配置项有些改了&…

PHP 调试 - Xdebug

PHP 调试指南.pdf PHP 程序员的调试技术 根据要调试的对象的不同,采取的方法也不一样: 调试 web 应用:对于 web 应用,可以在浏览器中安装插件,或者在 IDE 中设置,下面的设置二选一即可。 Get/Post 请求…

php程序怎么调试,你是怎么调试PHP代码的

1.echo 这是最简单的输出数据调试方法&#xff0c;一般用来输出变量值&#xff0c;或者你不确定程序执行到了哪个分支的情况下使用。 $var 7; if (0 > $var) { // do something echo 1; }elseif (0 < $var && 5 > $var) { // do something echo 2; }elseif (…

vscode-PHP调试工具测试

[VS CODE] PHP调试环境配置步骤 STEP1 安装配置VS-Code-PHPSTEP2 安装配置XDebugSTEP3 配置VSCode调试器扩展 Wampserver32 整合部署环境&#xff0c;集成Apache服务器 MySQL PHP一体的服务器配置环境 Wampserver版本: 3.0.6 32bit PHP版本: PHP 5.6.25 XDebug Xdebug is…

vscode +phpstudy 搭建php调试环境

在进行php的学习过程中&#xff0c;需要结合具体的实操才能让自己更加深刻的理解代码&#xff0c;所以需要在自己本机搭建一个php的调试环境&#xff0c;进行调试。 这里用到的比较简单快捷的vs code加phpsutfy的方法在本地搭建调试环境。 需要用到的软件 vscode phpstudy v…

PHP调试输出的方法

PHP程序一旦出错调试是个问题&#xff0c;一般常规方法当然是用echo()函数直接在页面上输出&#xff0c;来查看变量的内容。但是这样很麻烦有些地方未必能显示调试内容。所以有大神想出办法用Google Chrome浏览器“审查元素”或者“检查”下的Console也就是控制台来显示PHP等服…

PHP调试简单方法

作为一个php新手&#xff0c;在遇到php语句错误的时候无所适从啊&#xff0c;因为没有用IDE不知道在哪里看错误信息啊&#xff0c;现在找到了一个不用修改php.ini的简单方法&#xff0c;用于调试错误&#xff0c;分享一下。 一开始测试php页面的时候发现内容木有显示&#xff0…

Visual Studio Code搭建PHP调试环境

使用Visual Studio Code搭建PHP调试环境 一.需要安装的软件 Visual Studio Code安装可以参照博文&#xff1a; https://blog.csdn.net/qq_34195507/article/details/94558862 WAMP(包括Apache、MySQL、PHP、以及最关键的XDebug) wampserver安装可以参照博文&#xff1a; …

Windows下搭建PHP调试环境(phpstudy+VScode)

Windows下搭建PHP调试环境&#xff08;phpstudyVScode&#xff09; 0x00 问题背景0x01 配套环境0x02 php Xdebug简介官方介绍&#xff1a;Xdebug扩展启用 0x03 php.ini配置0x04 vscode配置VScode下载安装VScode调试配置1. PHP Debug2. launch.json3. PHP SERVER创建调试4.FireF…

PHP开发程序调试

php程序如何调试&#xff1f; 一、PHP自带的调试功能 1、修改php.ini &#xff08;1&#xff09;开发环境 需要打开报错输出显示,方便开发者调试。 display_errors On &#xff08;2&#xff09;生产环境 不能直接将错误输出&#xff0c;而是记入日志&#xff0c;以免透…

IntelliJ IDEA 2019 配置 PHP 调试 xdebug 并进行测试

&#x1f4d6;摘要 今天分享下 —— IntelliJ IDEA 2019 配置 PHP 调试 xdebug 的一些基本知识&#xff0c;欢迎关注&#xff01; &#x1f302;分享 先创建一个php项目&#xff1a;传送门------>IntelliJ IDEA 2019 配置PHP开发环境 和 IntelliJ IDEA 2019 创建php项目 。 …

PHP 调试 - 方式

之前学 Java 的时候&#xff0c;一直使用 IDE 的 console 控制台进行调试。后来搞 PHP 后&#xff0c;习惯在代码里面 echo 和 exit&#xff0c;然后在浏览器刷新看效果&#xff0c;把单步调试、变量值查看等常用的调试方式给忘了。其实通过 IDE 集成的控制台进行调试更高效。 …

使用xdebug调试php详细教程 原创

下载xdebug扩展 将phpinfo()中的信息全部复制到Xdebug中的文本框中&#xff0c;如下图所示&#xff1a;点击“Analyse my phpinfo() output”按钮。 跳转到如下图所示页面&#xff0c;会对本机中的php进行分析&#xff0c;点击“Download php_xdebug-2.7.2-7.2-vc15-x86_64.dll…

Xdebug安装与使用

Xdebug安装与使用 为什么需要Debugger? 很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等&#xff0c;其实对 于有较丰富开发经验的程序员来说这些也已经足够了&#xff0c;他们往往可以在程序执行的过程中&#xff0c;通过输出特定变量的值可以判断程序执行是否…

Git详细教程(五):查看分支、创建分支、合并分支

一、查看分支 查看的git命令如下&#xff1a; git branch 列出本地已经存在的分支&#xff0c;并且当前分支会用*标记 git branch -r 查看远程版本库的分支列表 git branch -a 查看所有分支列表&#xff08;包括本地和远程&#xff0c;remotes/开头的表示远程分支&#xff09…

git的分支与合并的两种方法

git的分支与合并的两种方法 如何将两个分支合并到一起。就是说我们新建一个分支&#xff0c;在其上开发某个新功能&#xff0c;开发完成后再合并回主线。 1. git merge 咱们先来看一下第一种方法 —— git merge 在 Git 中合并两个分支时会产生一个特殊的提交记录&#x…

Git合并分支代码到主分支的方法总结

目录 一、简介 二、实现步骤 一、简介 在使用Git开发过程中&#xff0c;我们一般都是在develop开发分支上进行开发&#xff0c;应该比较少会在master分支上直接开发的&#xff0c;一般如果开发分支进行了一次大版本的更新并且经过测试后&#xff0c;我们就需要将代码同步到m…

Git整合分支的两种方法——合并(git merge)与变基(git rebase)的区别

转载者总结了下原文的关键句&#xff0c;补充了几个相关链接&#xff0c;得到本文。 文章目录 Git整合分支的两种方法1、合并&#xff08;git merge&#xff09;2、变基&#xff08;git rebase&#xff09; 用例子理解 合并(git merge)与变基(git rebase)的区别合并&#xff08…

git 分支合并(dev合并到master分支)

前景&#xff1a;在项目开发中&#xff0c;经常会多分支协作开发&#xff0c;所以就会遇到分支合并等问题。以下用例是将dev分支合并到master分支 1. 对当前dev分支的本地代码进行储存 1.1 如当前代码未编辑完&#xff0c;不想提交&#xff0c;即可将当前dev分支的代码暂存 gi…