用Atom调试PHP

18

其实是很容易的一件事情,就因为一个端口的问题,费了好大劲,且听我慢慢道来。

安装xdebug

首先,我们要安装xdebug。在Mac上的安装方法相对简单:brew install php56-xdebug就好了。但是这里也遇到了一些小障碍,首先它说我原先用brew安装的php56不够新,那么就brew upgrade php56好了,结果它又说Xcode不够新,那好,先升级XCode,结果升级完了XCode还是说不行,在.configure的时候找不到zlib库,原来还需要在命令行执行xcode-select --install,执行完这个之后再执行brew upgrade php56,顺利通过。于是brew install php56-xdebug,这次顺利通过。

安装php-debug插件

接下来,我们直接在Atom里搜索插件php-debug,安装通过,执照它的要求,在/usr/local/etc/php/5.6/conf.d/ext-xdebug.ini文件中添加以下行:

[xdebug]
zend_extension="/usr/local/opt/php56-xdebug/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_connect_back=1    # Not safe for production servers
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=false

请注意,这里一定要把xdebug.remote_autostart设为false,因为如果你不把这里设置为false的话,下一步安装的浏览器插件就不会起作用。

安装Chrome插件

安装Xdebug Helper。这一步也相对比较容易,缺省安装就可以。安装之后就是这个样子,当你需要debug的时候,点击这个小甲虫把它变成绿色就可以了。我们上面一个步骤把autostart设为false就是为它服务的,如果你在上一步没有把autotart设为false的话,那么不论你按不按,每一个请求都会debug。

clipboard.png

联合调试

问题就出在这里,无论我如何刷新页面,Atom里的debug总是启动不起来。我一开始强烈怀疑是不是这个xdebug就没有启动,没有监听呢?于是我执行以下命令

sudo lsof -iTCP -sTCP:LISTEN -n -P

得到以下结果:

Atom\x20H 84631   27u  IPv6 0xdc8cd80c818ef9f      0t0  TCP *:9000 (LISTEN)
php-fpm   85455    6u  IPv4 0xdc8cd80d825f02f      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   85460    0u  IPv4 0xdc8cd80d825f02f      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   85461    0u  IPv4 0xdc8cd80d825f02f      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   85462    0u  IPv4 0xdc8cd80d825f02f      0t0  TCP 127.0.0.1:9000 (LISTEN)

我一开始不太理解原理,我以为php-fpm监听9000端口和Atom监听9000端口都是由于这一句设置

xdebug.remote_port=9000

导致的,虽然隐隐约约感觉这里不对,但是也没有多想,还在疯狂尝试各种方法,甚至加上了

xdebug.remote_log=/var/log/xdebug.log

查看我刷新页面时是否有请求发送给php-fpm,每次刷新页面时确实有请求进来,但总是连不通,无论如何刷新页面,Atom永远都是Listening状态:

clipboard.png

万般无奈之下,回去读文章,在最关键处读到原来xdebug里的9000端口设置是为连接远端设置的,也就是说xdebug本身不是服务器,而我们的Atom里的php-debug才是服务器!是我们的Atom在监听9000端口,而位于php-fpm里面的xdebug配置9000不是让它去监听9000,而是向我们这个Atom的9000端口发请求!

那我们的php-fpm的9000端口监听又是哪里来的呢?原来php-fpm的缺省配置/usr/local/etc/php/5.6/php-fpm.conf也是9000端口!

listen = 127.0.0.1:9000

所以是Atom和php-fpm在争夺9000端口!或者说xdebug误导了Atom去使用9000端口。

了解了这个,接下来就好办了,我们把ext-xdebug.ini里的xdebug.remote_port改成9090

xdebug.remote_port=9090

再把Atom里的php-debug监听端口改为9090

clipboard.png

这时候再在Chrome里面刷新页面,不再是Listening状态,变为Connected状态了!

clipboard.png

原先之所以没有人提到这个,是因为大家通常都是直接用Apache调用php,没有使用php-fpm,所以没有遇到这个问题。如果你也使用php-fpm的话,这篇文章一定对你有帮助。


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

zeemanhuang · 2017-11-08

踩坑了,看了此文找到问题关键,手动赞

回复

载入中...