php调试配置
错误信息输出
错误日志
nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog。原因是php-fpm的配置文件php-fpm.conf中默认是关闭worker进程的错误输出,直接把他们重定向到/dev/null,所以我们在nginx的error log 和php-fpm的errorlog都看不到php的错误日志。
所以我们要进行如下的设置就能查看到nginx下php-fpm不记录php错误日志的方法:
修改配置方法如下:
/etc/php/8.2/fpm/php-fpm.conf
如果没有就增加:
[global]
; Note: the default prefix is /usr/local/php/var
error_log = log/php_error_log
[www]
catch_workers_output = yes
/etc/php/8.2/fpm/php.ini
如果没有就增加:
log_errors = On
error_log = "/usr/local/php/8.2/log/error_log.log"
error_reporting=E_ALL
注意设置权限:sudo chmod 777 -R /usr/local/php
,否则无法正常生成日志文件
改完之后重启php-fpm服务:sudo systemctl restart php8.2-fpm.service
直接浏览器中输出php错误信息
一般这种只在调试过程开,方便程序处理,上线后就将错误信息都记录在日志。
/etc/php/8.2/fpm/php-fpm.conf
如果没有就增加:
[global]
; Note: the default prefix is /usr/local/php/var
error_log = log/php_error_log
[www]
catch_workers_output = yes
/etc/php/8.2/fpm/php.ini
; display_errors = Off
display_errors = On
然后重启服务:
改完之后重启php-fpm服务:sudo systemctl restart php8.2-fpm.service
php调试
php调试基于IDE(如phpstorm)进行调试,整个调试模型中有四个角色:
- 浏览器
- php-fpm
- dbgp proxy
这个视情况不需要 - IDE
关系如下:
操作步骤如下:
- 启动dbgpProxy
- IDE配置xdebug
- IDE注册到xdebug
- IDE启动监听php xdebug connection
- 浏览器增加XDEBUG_SESSION_START=
整体原理就是在需要进行php调试的时候,浏览器要在网址中增加XDEBUG_SESSION_START={IDE key}
参数,然后nginx接收数据包并转发给php-fpm。php检测到该参数,就通过Xdebug向IDE发送debug请求,之后就进入debug模式,没执行一行php命令就通过Xdebug发送给客户端操作一下,最终完成php解析。
是否使用dbgp proxy
dbgp proxy
使用时的命令为:./dbgpProxy -i :9001 -s 127.0.0.1:9022
,-i
和-s
参数都是指定监听ip和端口,-i
指定IDE连接的ip和端口,-s
指定的是运行php-fpm的服务器连接的ip和端口。
dbgp proxy
是个独立的软件,可以使用也可以不使用,使用的话,php-fpm配置时就直接将client_host
和client_port
指定为dbgp proxy
的服务器接口;如果不使用,那么直接将php-fpm配置指向IDE所在主机的IP和端口也可以进行调试。
php服务器端xdebug安装
- 版本选择
使用echo phpinfo()
输出php信息
- 点击页面,然后
Ctrl + A
全选页面内容然后复制,打开https://xdebug.org/wizard.php
网站将复制的内容都粘贴进去,然后点击分析,然后就有对应的安装包版本和安装方法,按照步骤进行安装。
dbgp proxy下载
是个可执行文件,直接下载运行即可:https://xdebug.org/download#dbgpProxy
xdebug配置
服务器部分配置
配置的时候一定要注意安装的是xdebug2
还是xdebug3
,两者的配置从根本上是不同的,这里使用的xdebug3,如果使用的是php-fpm,那么就打开/etc/php/8.2/fpm/php.ini
在配置文件最后补充:
[Xdebug]
zend_extension = /usr/lib/php/20220829/xdebug.so
xdebug.log = /home/i/sourceCode/xdebug/data/log/xdebug.log
xdebug.mode = develop,debug
xdebug.start_with_request = default|default
xdebug.client_port = 9001
xdebug.client_host = 192.168.232.1
xdebug.remote_handler = dbgp
xdebug.cli_color = 2
xdebug.var_display_max_depth = 15
xdebug.var_display_max_data = 2048
其中xdebug.idekey
网络上说必须要,但是测试过程中发现有无皆可。
然后就是xdebug.client_port
和“xdebug.client_host,这两个参数和是否使用
dbgp proxy有关,如果使用 配置完毕后使用
sudo systemctl restart php8.2-fpm`重启php-fpm。
IDE部分配置
IDE这里选择phpstorm,配置如下:
服务器配置
这个需要配置服务器,然后进行路径映射,否则无法正常调试:
调试设置
调试这里的设置如果是运行Xdebug设置ip:port直接指向IDE的ip:port,这里才需要配置,如果是Xdebug指向了dbgp proxy,那么这里就不需要配置:
这里的端口设置设置为Xdebug指定的端口;
dbgp proxy设置
如果使用了dbgp proxy软件介入了IDE与Xdebug通讯,此时Xdebug应该配置ip:port为dbgp proxy软件-s
指定的ip:port,而IDE侧需要配置DBGp代理
并注册到dbgp proxy软件:
- 配置代理:
- 注册代理:
注册代理之前要保证dbgp proxy软件已经打开,打开后进行注册:
测试
- 视需要运行
dbgp proxy
软件:./dbgpProxy -i :9001 -s 127.0.0.1:9022
- phpstorm视需要注册
dbgp proxy
- phpstorm开始侦听php调试链接
- 打开服务器,然后追加参数:
?XDEBUG_SESSION_START=owen
,这里的owen就是IDE key,这个如果使用DBGp proxy
要保证两个key一致,否则无法进行调试。
Chrome插件
Chrome有个插件 — Xdebug helper,右键选项可以设置IDE key(选择other才可以输入自定义ide key)。然后在需要的时候只需要点击插件选择模式即可。
一开始没有那个显示可以从图表右边的扩展插件图标中将XDebug Helper图表拖出来。不能选择模式的话是因为需要有网址才可以选择,如果不行可以重启浏览器,还不行就重启电脑。