其实是很容易的一件事情,就因为一个端口的问题,费了好大劲,且听我慢慢道来。
安装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。
联合调试
问题就出在这里,无论我如何刷新页面,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状态:
万般无奈之下,回去读文章,在最关键处读到原来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
:
这时候再在Chrome里面刷新页面,不再是Listening状态,变为Connected状态了!
原先之所以没有人提到这个,是因为大家通常都是直接用Apache调用php,没有使用php-fpm,所以没有遇到这个问题。如果你也使用php-fpm的话,这篇文章一定对你有帮助。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。