当前位置: 首页 > 后端技术 > PHP

用Atom调试PHP

时间:2023-03-29 14:09:51 PHP

其实很简单。因为一个端口的问题费了好大劲,慢慢来吧。安装xdebug首先,我们需要安装xdebug。Mac上的安装方法比较简单:brewinstallphp56-xdebug即可。但是这里也有一些小障碍。首先说我用brew安装的php56不够新,所以brewupgradephp56还好,但是也说Xcode不够新。嗯,先升级XCode,升级后XCode还是Sayno,.configure时找不到zlib库。原来需要在命令行执行xcode-select--install。执行完这个再执行brewupgradephp56,顺利通过。所以这次brewinstallphp56-xdebug顺利通过了。安装php-debug插件接下来我们直接在Atom中搜索插件php-debug,安装通过,license要求在/usr/local/etc/php/5.6/conf.d/ext-xdebug.ini文件添加以下行:[xdebug]zend_extension="/usr/local/opt/php56-xdebug/xdebug.so"xdebug.remote_enable=1xdebug.remote_host=127.0.0.1xdebug.remote_connect_back=1#对生产服务器不安全xdebug.remote_port=9000xdebug.remote_handler=dbgpxdebug.remote_mode=reqxdebug.remote_autostart=false请注意这里xdebug.remote_autostart必须设置为false,因为如果你不设置这个为false,浏览器插件安装了下就不行了。安装Chrome插件以安装XdebugHelper。这一步也比较容易,默认安装就可以了。安装后是这个样子的,需要调试的时候,点击小甲虫就可以变绿了。我们在上一步中将autostart设置为false来为其提供服务。如果你在上一步没有设置autotart为false,那么不管你按不按,每一个请求都会被调试。联调问题就到这里。无论我如何刷新页面,Atom中的调试都无法启动。一开始强烈怀疑是这个xdebug没启动,没监控?所以我执行了以下命令sudolsof-iTCP-sTCP:LISTEN-n-P并得到以下结果:Atom\x20H8463127uIPv60xdc8cd80c818ef9f0t0TCP*:9000(LISTEN)php-fpm854556uIPv40xdc8cd80d825f02f0t0TCP:0.017(LISTEN)php-fpm854600uIPv40xdc8cd80d825f02f0t0TCP127.0.0.1:9000(LISTEN)php-fpm854610uIPv40xdc8cd80d825f02f0t0TCP127.0.0.1:9000(LISTEN)php-fpm854620uIPv40xdc8cd80d825f02f0t0TCP127.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,这篇文章一定对你有所帮助。