PHP+XDEBUG的使用

(一)设置php:

让 cgi 和 cli 使用不同的配置文件:

http 请求用 php.ini,命令行脚本 用 php-cli.ini:

sudo cp /usr/local/php/etc/php.ini /usr/local/php/etc/php-cli.ini


对http请求 仅用cookie触发debug:

设置xdebug,仅被动触发debug(仅对带cookie:XDEBUG_SESSION=你的idekey 的请求 触发debug):

编辑 php.ini,添加或修改以下项:

zend_extension = "/usr/local/php/modules/xdebug.so"
xdebug.default_enable=On
xdebug.collect_params=On
xdebug.collect_vars=On
xdebug.collect_return=On
xdebug.show_local_vars=1
xdebug.remote_handler=dbgp
xdebug.remote_enable=1
xdebug.remote_host=172.16.2.69                   # 安装phpstorm的机器的ip
;xdebug.remote_connect_back=1                    # 如果启用并且这里写 1,则启动调试时会自动  连接请求来源ip。这项配置会覆盖 remote_host 设置的ip。不建议开启这个(万一有启动了360安全卫士==的机器访问你的虚拟机。。360安全卫士==防火墙软件开启网络防护后,外来的tcp连接 会被长时间挂起,造成php-fpm worker进程假死)。
xdebug.remote_port=9001                          # 与phpstorm设置保持一致
xdebug.remote_autostart=Off
xdebug.remote_log=/dev/null
xdebug.auto_trace=Off
xdebug.show_exception_trace=0

改完重启php-fpm。


命令行执行脚本时自动触发debug:

命令行执行脚本时,如果phpstorm启动了debug,则触发debug:

编辑 php-cli.ini,添加或修改以下项:

zend_extension = "/usr/local/php/modules/xdebug.so"
xdebug.default_enable=On
xdebug.collect_params=On
xdebug.collect_vars=On
xdebug.collect_return=On
xdebug.show_local_vars=1
xdebug.remote_handler=dbgp
xdebug.remote_enable=1
xdebug.remote_host=172.16.2.69                   # 安装phpstorm的机器的ip
xdebug.remote_port=9001                          # 与phpstorm设置保持一致
xdebug.remote_autostart=On
xdebug.idekey=你的idekey-cli                      # 最好自己独有,不跟别人重复
xdebug.remote_log=/dev/null
xdebug.auto_trace=Off
xdebug.show_exception_trace=0

(二)设置phpstorm和 浏览器:

1)设置phpstorm调试端口等,另外建议把Zend、Smarty等加入 skipped-paths:

技术分享

 2) 进入 Run -> Edit Configurations,添加 server:

 技术分享

3) 添加调试配置:

技术分享

4) 类似第三步,继续添加 "Ide key"  分别为   "你的idekey-cs"、"你的idekey-cs-cs"、"你的idekey-cs-cs-cs"、"你的idekey-cs-cs-cs-cs" 和 "你的idekey-cli"  的调试配置,

用于调试curl服务端代码("cs"  表示  curl server-side,一个 "-cs" 后缀表示调试第一层curl的服务端,两个表示调试第二层....)。

建议加3个或以上的 类似配置。

技术分享

5) 启动debug: 菜单 Run -> debug... -> 选择调试配置名称。同时启用多个配置 就可以同时调试多层http请求。

下图启用了三个调试配置: devbox、devbox-cs-cs、devbox-cs-cs-cs,没有启用 devbox-cs,

所以会调试  web请求、第二层curl、第三层curl,不会调试 第一层curl。

启动  devbox-cli  配置可以调试  在devbox机器上执行的  命令行php脚本。

技术分享

6) 修改这个链接后  从浏览器打开:

http://192.168.100.你的虚拟机IP:8072/setcookie.php?idekey=你的idekey

这个请求会给浏览器添加cookie:XDEBUG_SESSION=你的idekey,domain=虚拟机完整IP(不带端口),并设置成长时间不过期。此后对虚拟机的访问就会触发调试。

(三)防调试超时:

修改以下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;

(四)其它配置建议:

  • Linux/Mac下 在phpstorm安装目录下的 bin/phpstorm.sh 顶部加一行 ulimit -s 256 可以节省大约600M物理内存(如果在“phpstorm内部”运行php解释器遇到问题,可以尝试 ulimit -s 512,没实测)。

  • 建议开8个或更多 php-fpm worker进程,如果有N层curl则至少开N+1个,否则会请求会死锁。

  • 如果遇到 断点被忽略、不能step-in、无法对变量set-value 等奇怪的问题,可以禁用 eaccelerator 试试。

  • 遇到  页面长时间加载不下来  的情况,极可能是因为 你的笔记本禁止了远程连接(360安全卫士==网络防火墙软件都会禁止外来tcp连接),可以从虚拟机检查连接是否畅通:

    One-Box-Test-6 devbox $ telnet 你的笔记本IP  9001 # 登录到虚拟机执行



本文出自 “我相信” 博客,请务必保留此出处http://mrcelite.blog.51cto.com/2977858/1612320

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。