调试代码的时候 我们一般都是直接echo/var_dump/或者log的形式来调试。
如果代码很复杂 变量很多 输出的时候内存爆了 直接500错误。
对于这种大数据的情况 用xdebug来调试会方便些。
测试环境
-
服务器: ubuntu + php7.1 + xdebug
-
客户端IDE: sublime text3
-
调试的项目域名:http://zou-m2-ee.mgtdev2.iggo.fi
-
调试的项目服务器上路径:/var/www/zou-m2-ee.mgtdev2.iggo.fi
-
调试的项目客户端IDE里的路径:/Users/zouhongzhaoo/Documents/code/project/zou-m2-ee.mgtdev2.iggo.fi
服务器端xdebug配置
先安装xdebug,自己去谷歌下怎么安装,一般是apt-get install php71-xdebug
修改xdebug.ini文件
vim /etc/php/7.1/mods-available/xdebug.ini
改成
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1
xdebug.remote_log=/var/log/php-xdebug.log
xdebug.remote_port=9001
xdebug.idekey="PHPSTORM"
参数说明:
xdebug.remote_enable 1就是启用,0就是禁用
xdebug.remote_autostart 默认是false。为1就是自动触发
xdebug.remote_handler = dbgp 调试器协议,默认就是dbgp,并且只有这一个选项。
xdebug.remote_host = 127.0.0.1 远程主机,也就是客户端的ip,默认是本地服务器ip localhost
xdebug.remote_log = 默认为空,定义调试日志路径
xdebug.remote_port = 9001 默认为9000,远程主机端口,也就是xdebug服务器端口,IDE客户端的端口也要设置一样,都是9001。
xdebug.idekey = "PHPSTORM",默认为*complex*,这个是IDE专用的 用来传密钥给DBGp处理协议,因为IDE都有内置的xdebug客户端,IDE里启动xdebug调试时 会打开本地的9000端口,然后把idekey传给远程服务端的DBGp处理协议。所以客户端的idekey要跟服务端的ideky一致才行,不然不匹配就调试不成功。
注意: xdbeug只需要这几个配置就行,不要加其他配置了,免得有问题。
更多参考见官方文档
https://xdebug.org/docs/all_settings
保存后,就重启下nginx和php-fpm
客户端IDE设置
我是在mac下安装的sublime text3编辑器,简称为IDE。
因为要连远程服务器,所以需要安装sftp和xdebug这2个插件。
sftp用来连接远程服务器,下载代码到本地
xdebug用来调试,在代码里加断点来调试
具体怎么安装自己百度即可。
好了,现在重头戏开始了,对IDE进行设置。
1,先创建一个project,也就是工程,注意一个网站对应一个工程。
比如我调试的是http://zou-m2-ee.mgtdev2.iggo.fi这个网站,那么就先创建改项目目录
/Users/zouhongzhaoo/Documents/code/project/zou-m2-ee.mgtdev2.iggo.fi
自己手动创建即可。
然后把目录添加为工程
并且执行 项目=>项目另存为
2,编辑存储后的project文件
改成
{
"folders":
[
{
"path": "/Users/zouhongzhaoo/Documents/code/project/zou-m2-ee.mgtdev2.iggo.fi"
}
],
"settings": {
"xdebug": {
"path_mapping": {
"/var/www/zou-m2-ee.mgtdev2.iggo.fi/" : "/Users/zouhongzhaoo/Documents/code/project/zou-m2-ee.mgtdev2.iggo.fi/"
},
"url": "http://zou-m2-ee.mgtdev2.iggo.fi",
"ide_key": "PHPSTORM",
"super_globals": true,
"close_on_stop": true,
"port": 9001,
"debug": true
}
}
}
注意这里的path_mapping很重要,前面是服务器里的路径,后面是本地IDE客户端的路径。要一致才行。
ide_key 和 port 都要跟服务器端的xdebug一致。
这里的url就是你要调试的页面,我这里是调试的首页。如果你要调试其他页面,比如分类页面test.html。那么就改成
http://zou-m2-ee.mgtdev2.iggo.fi/test.html
3,给该项目设置sftp
右键 -> SFTP/FTP ->Map to Remote
4,从远程服务器下载文件,加断点进行调试
比如首页,就把pub/index.php的代码下载下来
对
$app = $bootstrap->createApplication(\Magento\Framework\App\Http::class);
这行代码加断点
选中这一行,鼠标右键
开始调试
Tools -> Xdebug -> Start Debugging (Launch Browser)
编辑器下面就会出现xdebug的终端界面
但是你会发现目前还是不行,一直没有输出。
这是因为xdebug里remote_host里是127.0.0.1,不是你客户端IDE所在电脑的ip,所以无法识别你的xdebug请求。
那么是不是把remote_host改成你的电脑ip就行了呢? 不行的,因为你电脑的ip是共享ip,不是独立ip,被运营商(电信/移动/联通)限制了,导致服务器端xdebug无法通过这个共享ip找到你本机地址,进而没有数据传到你的IDE,就不会输出。
这个时候,需要用到ssh 隧道,在你的终端里执行
ssh -R 9001:localhost:9001 用户名@服务器ip
也就是把本地9001端口挂载到服务器的9001端口上。
这样的话 服务器就能通过9001端口找到你IDE客户端本机地址了,然后给客户端本机传数据,最后IDE里就有输出了。
所以这个ssh隧道不能断,要一直连着,如果你电脑关机了或者睡眠了,就要重新连接下ssh。
windows里的ssh隧道用putty.exe工具来连接,具体的参考
https://www.jetbrains.com/help/phpstorm/remote-debugging-via-ssh-tunnel.html
你Stop Debugging后,在Start Debugging (Launch Browser),等个几秒钟,就会出现数据了
参考文献:
https://www.jetbrains.com/help/phpstorm/remote-debugging-via-ssh-tunnel.html
https://blog.csdn.net/autoliuweijie/article/details/80283689
https://xdebug.org/docs/all_settings
http://guojianxiang.com/posts/2015-09-06-PHP_Debug_Tool-Xdebug.html
后记
如果你是用的PHPSTORM编辑器,那么设置更简单,自行百度即可。
如果你的本地ip是公网独立ip,也就是说没有被运营商限制,那么就不需要ssh隧道这么复杂。直接修改下服务器的xdebug.xml
把
xdebug.remote_host=127.0.0.1
改成
xdebug.remote_host=你的本地电脑公网ip
再加一个
xdebug.remote_connect_back=1
也就是直接把调试数据传给公网ip