开发php,还是找个专业的Ide较好,vscode毕竟在php上不专业,需要下载各种插件才行,还不支持多线程调试,因此小编下载了phpstorm,打算以后用phpstorm来开发php项目,断点调试代码是必不可少的,还是用xdebug吧,可小编在网上搜索了无数篇文章,照着做了一天,竟然没调试成功。最后功夫不负有心人,终于调试成功,想着成千上万的phper肯定也会遇到此类问题,就索性写一篇博文,教大家彻底解决此问题。
首先说下配置环境,三个情景:分别是:
1. ide(即phpstorm等,也称调试客户端)与web服务端(即php程序)都在同一机器上,此类最好配。此种调试ide与web服务端运行的php代码都在同一位置,即是同一项目,不需要考虑远端连接。
2. ide与web服务端在同一局域网网段上,如本机安装有vmware,php安装在vmware上的虚拟机上,这种也算是在同一局域网网段上。先假设ide在192.168.0.2上,php及apache等在192.168.0.3上,便于以后讲解。此种调试情景中,ide调试的php代码与web服务端运行的php代码不在同一位置,需要进行映射对接,因此稍有麻烦。
3.ide与web服务端不在同一局域网中,其实这种情况最常见,如php代码与php程序均在远端机房内,ide在依靠wifi上网的笔记本中,这种情况配置起来最复杂,需要在远端服务器上下载安装dbgp服务器,经由dbgp桥接才能实现远程调试。但小编感觉没必要这样做,一是直接调试生产端代码不安全,二是有替代方案,可以将生产端代码下载到本机vmware虚拟机上,利用虚拟机模拟实现远端的linux环境。因此本文暂不考虑此种环境。
下面详细讲解下1和2两种情景的配置过程,两种调试虽然一个是本地调试,另一个是远程,但配置情况差不多,因此本文将其放一起讲解,需要时再分别讲解。
一、下载xdebug及配置php.ini
xdebug官网下载地址:https://xdebug.org/download.php,你需要仔细分析和选择要下载的对应版本,否则无法调试。由于非常容易选择错误,建议进入网页 https://xdebug.org/wizard.php,然后将自己phpinfo()输出的信息全复制拷贝到该网页信息框里,让xdebug官方系统为你选择合适的版本。下载好xdebug插件后,安放在某一位置,然后将如下配置添加至php.ini中,注意仔细看下面配置中的注解,都是小编亲手所写,饱含心血和经验。
[Xdebug] zend_extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so//根据自己xdebug所在位置填写 xdebug.collect_params=1 xdebug.collect_return=1 xdebug.auto_trace=On xdebug.profiler_enable=On xdebug.mode=debug xdebug.remote_enable=On//情景1的本地调试可注掉,也可开启 xdebug.client_host=192.168.0.2//ide所在host,此处是按情景2配置,情景1中,ide所在host本地的配成127.0.0.1。别漏掉此项,很多不成功往往是因为此项疏漏 xdebug.remote_host=192.168.0.3//ide或dbgp服务器所在host,此处是按情景2配置。情景1中,可配成127.0.0.1 xdebug.remote_port=9003//注意,用phpInfo()查看下,看是否一致 ;xdebug.remote_handler=dbgp//情景3需要,配了dbgp服务器就填,没配就没必要设置 ;xdebug.idekey = PHPSTORM//与phpstorm上的DBGP proxy设置中的idekey保持一致,如果客户机与服务器在同一网段上,甚至在同一台机器上,即情景1和2就没必要配置dbgp服务器,如果不在同一网段上,即情景3,就必须配置.
按照以上配置和说明配置好php.ini以后,赶紧重启php服务,千万别忘了此项,小编就是忘记了重启,结果死亡了很多脑细胞,又掉了几根头发。
二、 phpstorm中的配置
(1)在文件->设置->语言与框架中->PHP 设置你当前的php编译器路径。
(2)在文件->设置->语言与框架中->PHP->debug PHP->debug 设置端口,端口默认为9000,小编配置的是9003,需要与上面php.ini中的xdebug.remote_port保持一致。
(3)在上述窗口中点击validate按钮,如下图所示设置并检验是否成功。
(4)在文件->设置->语言与框架中->PHP->server中,点击+号按钮,添加server,如下图分别是情景1本地服务器和情景2的远程服务器配置说明。
情景1本地服务器配置示例
情景2远程服务器配置示例
三、设置断点,打开浏览器开始调试
好了,经过以上配置就基本上配置成功了,剩下的就是用phpstorm打开本地项目,然后打开需要断点调试的代码文件,在左边行号旁双击插入断点,开始调试。开启调试有两种方法,一个是利用phpstorm的内置php执行环境调试,另一个是用浏览器直接访问文件所在网址来调试,小编不推荐第一种,这种不但配置麻烦,而且与实际生产环境脱节,不如直接使用浏览器来调试,如果你要用浏览器调试,建议用chrome类浏览器,并安装上xdebug helpe插件,其实如果不想安装插件,就需要设置cookie了,为本域添加一条“XDEBUG_SESSION=PHPSTORM”,也一样能达到效果,这种方法特别适合用postman之类工具来开启调试,非常方便。如果用xdebug,需要简单设置下,如下图所示:
四、常见错误
坑1:注意修改过php.ini后,重启php;
坑2:客户机与服务器不在同一网段上,例如家中虽然只有一个路由器,但有两个网段,一个是4G,一个是5G,这就不是同一网段。
坑3:网上很多教程的php.ini的配置都少了client_host的配置,结果复制过来后不管用
五、其它配置建议
1. 远程服务器中修改以下3处配置,防止调试过程中过早断开与phpstorm的连接:
# php*.ini (/usr/local/php/etc/php*.ini): max_execution_time=7200 # php-fpm.conf (/usr/local/php/etc/php-fpm.conf): request_terminate_timeout = 0 # fpm不加执行时间限制,少管闲事。 # nginx (/usr/local/nginx/conf/nginx.conf)在http端添加或修改这两个: fastcgi_connect_timeout 7200s; # 因为php-fpm可能会被调试阻塞 fastcgi_read_timeout 7200s;
2. Linux/Mac下 在phpstorm安装目录下的 bin/phpstorm.sh 顶部加一行 ulimit -s 256 可以节省大约600M物理内存(如果在“phpstorm内部”运行php解释器遇到问题,可以尝试 ulimit -s 512,没实测)。
建议开8个或更多 php-fpm worker进程,如果有N层curl则至少开N+1个,否则会请求会死锁。
3. 如果遇到 断点被忽略、不能step-in、无法对变量set-value 等奇怪的问题,可以禁用 eaccelerator 试试。
4. 遇到页面长时间加载不下来的情况,极可能是因为 你的笔记本禁止了远程连接(360安全卫士==网络防火墙软件都会禁止外来tcp连接),可以从虚拟机检查连接是否畅通:
六、结语
好了,小伙伴们,终于写完了,本篇文章是博主在为网风笔记移动端编写后台api,配置php调试环境时根据亲身经历所写,码文字真不容易,还请读完此篇文章感觉有收获得亲们多多支持本博主下,并给本文推荐下,以让更多朋友受益,也支持下本博。顺便介绍下本人近来开发的一个chrome及edge浏览器插件“网风笔记”,网风笔记可以让你在浏览器上一键以最养眼的方式观看并编辑网页文章,并具有背景涂色、划线、文字编辑、分类保存等等功能。对于喜欢用网页查找文章学习的同学,网风笔记定是你最好的助手。 除了自身的笔记功能外,附带功能也非常丰富强大,一个扩展就让浏览器轻松拥有音视频下载、截图涂鸦、解除网页复制限制、一键提取文章、自由点选段落、快捷打印成A4格式文档、网页笔记编辑整理、定向发布等等功能。这插件简直能让浏览器飞起来,定会让你使用起来爱不释手,欢迎大家免费薅羊毛下载使用,网风官网(netwind.cc)上有安装导引,帮您在edge或chrome上安装。近期本人正在开发配套移动端网风笔记,还请大家多多关注并支持。
七、后记
本文发出后,收到不少小伙伴的反馈,不少人反映说,网上别的类似配置文章中一般要求配置如下图所示的DBGP代理,你文章中怎么没提及啊?
在此,小编作下解释,上面是为本文所提及的情景3的dbgp服务器配套所制,如你远程服务器没安装dbgp服务器,你就没必要填写该项。小编的phpstorm此项什么也没填写,照样运行得很好,如果你要配置dbgp服务器,就按上图所示来填写。