Xdebug作为PHP的代码调试工具,提供了丰富的调试函数,也可将其配置为zend studio、editplus、phpstorm等IDE的第三方调试插件。通过开启Xdebug的自动跟踪(auto_trace)和分析器功能,更可以直观察PHP源代码的性能数据,从而优化PHP代码。
但无奈Xdebug的官方文档的语言是英文,PHP新手想按照官方文档把Xdebug配置好,也并非一件容易之事。本文就是关于PHP如何开启xdebug调试的一份简单指南,希望越来越多的人都能用上调试利器Xdebug。
一、Xdebug调试原理
借用官方网站图一张:
右边机器(IP=10.0.1.2)是布署了Nginx/php的服务端(下文简称php服务端),左侧机器(IP=10.0.1.42)是布署了IDE(比如Phpstorm)的IDE端(下文简称IDE端)。
调试中基本通信过程说明:
- 打开浏览器,访问web页面,nginx通过fastcgi网关接口加载PHP脚本运行 (对应图上第一个朝向右的箭头)。
- 然后php解释器(当然必须已装好Xdebug扩展),向IDE端的9000端口( 本文下面用的都是9001,原因是我本机9000端口被其它程序占用)发起基于DBGP协议的调试请求。
- IDE端收到DBGP协议请求后,就可以开始单步调试了。
- 调试完成后,服务端php解释器执行完毕,向浏览器返回response。
二、安装配置Xdebug
$: php --version
PHP 7.0.13-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
with Zend OPcache v7.0.13-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies
- 安装Xdebug扩展
去官网https://xdebug.org/download.php下载对应版本的Xdebug。我的操作系统是ubuntu16.04,所以下载了source版本。Xdebug 2.6.0beta1下载链接
cd xdebug-source-directory
phpize #如果没有,请先安装Php7.0-dev包
which php-config #查找php-config命令的位置
./configure –with-php-config=/usr/bin/php-config
make
make install #可能需要加上sudo
#安装完了,要记一下xdebug.so的安装位置,下面配置php.ini的时候需要
[Xdebug]
zend_extension="/usr/lib/php/20151012/xdebug.so"
xdebug.remote_enable=1
#与remote_connect_back不能同时开启
xdebug.remote_host="localhost"
xdebug.remote_port=9001
#与remote_host不能同时开启
;xdebug.remote_connect_back = 1
xdebug.remote_handler="dbgp"
xdebug.idekey=PHPSTORM
解释一下:
zend_extension每个人安装xdebug扩展的位置可能不同,按实际情况填写。
remote_enable 必须设置为1
remote_host和remote_port分别填localhost和9001。remote是指IDE端,并非浏览器端或者PHP服务端,注意理解清楚。
remote_handler只能填dbpg,照填就行。
idekey是用于进行会话身份标识的,需要与后面IDE端填的保持一致,这里填的是PHPSTORM。
三、IDE配置
以Phpstorm为例子说明。
-
配置php-cli
-
配置xdebug端口,我填的是9001,与前面php.ini中xdebug.remote_port保持一致。
-
配置IdeKey,与前面php.ini中xdebug.idekey保持一致。Host和Port会自动填好。
-
配置servers,这个下面讲远程调试的时候再讲。
其它操作同上,不再赘述。
2)跨域调试
Xdebug开启调试需要依赖cookieXDEBUG_SESSION=PHPSTORM;path=/。但在跨域请求中,浏览器默认并不会传输cookie, 从而无法开启调试。解决思路也简单,想办法让浏览器在跨域请求中支持带上cookie就可以了。
有两种处理方式:
- Php服务端代码设置允许跨域cookie,并添加"Access-Control-Allow-Credentials"="true"
以laravel框架为例,在中间件中添加以下代码:
public function handle($request, Closure $next)
{
return $next($request)
->header("Access-Control-Allow-Credentials", "true")
设置的关键点是Access-Control-Allow-Credentials必须设置为true, 从而允许跨域请求时带上相关cookie。
$.ajax({
headers:{
"Content-Type":"text/plain",
},
url:url,
type:"POST",
data: bodyText,
dataType:"json",
xhrFields: {
withCredentials: true
},
beforeSend: function(xhr) {
document.cookie = "XDEBUG_SESSION=PHPSTORM;domain=localhost;path=/";
},
async:false,
设置的关键点是在xhrFields中增加withCredentials:true和在beforeSend函数中增加
document.cookie = "XDEBUG_SESSION=PHPSTORM;domain=localhost;path=/";
说明一点:跨域请求开启调试,通过chrome书签或者直接修改浏览器cookie的方式并不起作用,猜测原因可能是因为浏览器本身的cookie和XmlHttpRequest中的cookie并不是一回事儿。
- 借助nginx,开启跨域调试
(大招来啦!)
现在大部分Phper开发的环境都是LNMP,那么我们可以请nginx帮忙修改cookie,从而将cookie传输到php服务端。
nginx默认不支持修改请求的header字段,我们需要下载安装headers-more-nginx-module扩展,下载地址 https://github.com/openresty/headers-more-nginx-module。
PS:给nginx安装扩展不再赘述了哦。不会的话,自己百度下吧。
- 修改nginx.conf虚拟主机配置,如下所示:
more_set_input_headers "Cookie:XDEBUG_SESSION=PHPSTORM; $http_cookie";
其它操作同上,不再赘述。
3)php脚本调试
有两种处理方式:
- 方式一:
打开Phpstorm,找到myscript.php文件,点击右键Debug 'myscript.php'即可。
- 方式二:
修改环境变量也可以开启Xdebug调试
export XDEBUG_CONFIG="XDEBUG_SESSION=PHPSTORM"
php myscript.php
4)调试外网远程主机
分为如下几步:
PS:如果觉得内网穿透麻烦的话,也可以使用ssh来实现同样的功能,而且是免费的。
参见我写的另一篇文章利用ssh隧道,进行外网php xdebug调试和nodejs调试
- 修改远端主机php-fpm的php.ini的xdebug部分如下:
[Xdebug]
zend_extension="/usr/lib/php/20151012/xdebug.so"
xdebug.remote_enable=1
#mzxxxxxxxxxxxxxpc.cn就是内网穿透映射中提供的域名
xdebug.remote_host="mzxxxxxxxxxxxxxpc.cn"
#4xxxx2就是内网穿透映射提供的端口
xdebug.remote_port=4xxxx2
xdebug.remote_handler="dbgp"
xdebug.idekey=PHPSTORM
service php7.0-fpm restart
- openresty或者nginx的server块中添加以下配置,开启xdebug session。
more_set_input_headers "Cookie:XDEBUG_SESSION=PHPSTORM; $http_cookie";
如果不愿意用openresty的方式,那么点击浏览器标签start-debugger也可开启xdebug session
新建php web application.png
- 最后一步,打上断点,点击菜单上
RUN=>debug xxx web Application,就可以开启调试了。
- 遗留问题:外网远程调试,必须点击菜单上的
RUN=>debug xxx web Application才能正常进行调试,其它方式打开网站的话,调试总是会出各种各样的问题。
Xdebug开启调试的配置就这么简单。。。
END!
来源:https://www.cnblogs.com/ashaff/p/11609343.html |