深入理解PHP的远程多会话调试


Posted in PHP onSeptember 21, 2017

一、背景介绍

本文主要给大家介绍了关于PHP远程多会话调试的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

解决什么问题:多个项目断点调试,www.mysite.com项目会调用api.mysite.com项目REST接口,在www.mysite.com项目下触发动作时,更方便的直接调试api.mysite.com项目中的接口。

适用什么场景:跨项目调试,远程调试,比简单的var_dump更方便易用。

二、远程调试配置

Nginx+PHP-fpm环境,配置php.ini拓展

[Xdebug]
zend_extension = /usr/local/php56/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
xdebug.remote_enable=1
remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.idekey=XDEBUG

注意:CLI环境的php与fpm的php是否使用的不同php.ini配置文件,需要配置fpm对应的php.ini

检查是否配置正确

深入理解PHP的远程多会话调试

将远程(fpm所在主机10.99.1.185)端口9000映射到本地端口9000:

ssh -CNg -R 9000:localhost:9000 root@10.99.1.185

本地安装openssh后可以直接使用ssh命令

深入理解PHP的远程多会话调试

在服务器可以看到9000端口被ssh占用

深入理解PHP的远程多会话调试

PHPSTORM也需要配置Xdebug,配置同时启用的调试会话为多个,端口9000,接受外部请求。

深入理解PHP的远程多会话调试

深入理解PHP的远程多会话调试

配置项目相关的path mapping,域名,端口

深入理解PHP的远程多会话调试

三、跨会话(项目)调试配置

跨项目调试的核心是把触发Xdebug调试的条件作为参数发送给api.mysite.com项目或者后续的其他项目。

www项目代码如下:

frontend.php

<?php

$personJson = file_get_contents('http://api.mysite.com/backend.php');

$person = json_decode($personJson);

var_dump($person);

api项目代码如下:

backend.php

<?php

class Person {

public $Name;

public $Email;

}

$person = new Person();

$person->Name = "Maarten";

$person->Email = "maarten.balliauw@jetbrains.com";

echo json_encode($person);

需要修改www项目,把xdebug所需要的触发远程调试的网络请求参数加上:

<?php

$debuggingQuerystring = '';

if (isset($_GET['XDEBUG_SESSION_START'])) { // xdebug

$debuggingQuerystring = 'XDEBUG_SESSION_START=' . $_GET['XDEBUG_SESSION_START'];

}

if (isset($_COOKIE['XDEBUG_SESSION'])) { // xdebug (cookie)

$debuggingQuerystring = 'XDEBUG_SESSION_START=PHPSTORM';

}

if (isset($_GET['start_debug'])) { // zend debugger

$debuggingQuerystring = 'start_debug=' . $_GET['start_debug'];

}

$personJson = file_get_contents('http://api.mysite.com/backend.php?'
. $debuggingQuerystring);

$person = json_decode($personJson);

var_dump($person);

自有项目可以在通用的网络请求封装类中增加cookie参数:

curl_setopt($this->ch, CURLOPT_COOKIE, "XDEBUG_SESSION=XDEBUG");

深入理解PHP的远程多会话调试

四、调试流程

深入理解PHP的远程多会话调试

  • 确保调试参数已经转发给api接口
  • 增加同时可以调试的会话数量
  • 开启调试监听,开启服务端Xdebug

五、总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

六、参考资料

https://confluence.jetbrains.com/display/PhpStorm/Simultaneous+debugging+sessions+with+PhpStorm

https://paper.seebug.org/308/

PHP 相关文章推荐
php 无极分类(递归)实现代码
Jan 05 PHP
php小偷相关截取函数备忘
Nov 28 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
如何修改和添加Apache的默认站点目录
Jul 05 PHP
PHP取余函数介绍MOD(x,y)与x%y
May 15 PHP
PHP实现的json类实例
Jul 28 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP模版引擎原理、定义与用法实例
Mar 29 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 #PHP
简单实现php上传文件功能
Sep 21 #PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 #PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 #PHP
基于Laravel实现的用户动态模块开发
Sep 21 #PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 #PHP
PHP判断json格式是否正确的实现代码
Sep 20 #PHP
You might like
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
jquery选择器使用详解
2014/04/08 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
vue组件实例解析
2017/01/10 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
学习自我鉴定
2014/02/01 职场文书
女娲补天教学反思
2014/02/05 职场文书
继承公证书格式
2015/01/26 职场文书
家属慰问信
2015/02/14 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
绿里奇迹观后感
2015/06/15 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
Flask response响应的具体使用
2021/07/15 Python
基于Python实现股票收益率分析
2022/04/02 Python
zabbix配置nginx监控的实现
2022/05/25 Servers