如何交朋友通过Docker编译的PHPstorm,xDebug和远程分支? 太简单了...

美好的一天,哈伯!

一年前,我在PHP中调试代码的过程包括两行:

var_dump($variable); die(); 

当然,我有时会不得不使用更多的“复杂”结构:

 console.log(data); 

 echo json_encode($variable, JSON_UNESCAPED_UNICODE); exit(); 

不,你是什么! 我知道-在我们这个时代,文化程序员不适合这样做

古代工艺
关于另一种古老工艺的玩笑

但老实说,我总是害怕自己不了解的东西。 包括xDebug 打印机 ,尤其是如何配置整个设备。 有一天,我设法在汽车上和一个本地项目中做到了–欢乐无止境。 几个月后,我遇到了一个新问题,如果该项目是由docker通过CI远程构建的,那么如何通过xDebug在PHPstorm中进行调试。

如果您像我一样,在配置其他内容方面遇到困难,欢迎来到猫这里,我将讲讲我在使用诸如Docker,xDebug,CI之类的令人恐惧的词来设置调试环境方面的经验。

对于那些不喜欢水并且想直接进入环境本质的人。

为什么要摆脱发霉的调试方法并转向使用适当的技术?


我欺骗了那只猫,从事手工调试,这不仅是因为我害怕配置某些东西,不是因为它太笨,而是因为我不需要更方便的东西。 大多数时候,我在功能强大的计算机上本地处理项目,而且任务并不那么复杂,因此调试过程开始占据相当重要的位置。

在某个时候,我自己意识到自己不舒服,并在进行本地项目时尝试结识xDebug和PHPstorm。 麻烦的是,我发现的大多数文档和指南都暗示阅读本书的人员精通主题领域并且理解所有内容,在我的情况下并非如此,我在第一个xDebug设置上花费了4-5下午2点。 这在道德上是很难的,我感到无聊。 然而,事实证明可以配置,一切正常!

是的,它变得更方便,无论是在本地还是在家里,但是在主要工作中,我都是远程完成站点的操作,而且大多数情况下,由于机器性能低下或部署过程不便,我无法在本地卸载站点,或者由于以下原因而影响服务器设置:因此,托管可以进行“实时”的编辑和调试,以进行html注释的print_r(在该工作中它是“正常的”,尽管对此经验并不感到骄傲)。

图片

但是,三个月前,我搬到一家凉爽的公司,开始从事一个非常认真的高负荷项目。 这对我来说已经发生了很多变化。 基础结构和开发过程大致如下:有一个GitLab服务器,每个项目都有其自己的存储库,任务来到Jira,您通过任务编号创建分支,使用CI创建分支时,自动创建您自己的沙箱以及您安静地工作的站点,每次推送重新组装分支,在您完成对代码审查的工作之后,将分支倒入master。

除了一个BUT之外,其他一切都很酷,就我而言,每个分支重建一个大约需要10秒钟。 在开发本身的过程中,这是一个微不足道的时间,因为由于不确定性和很少的经验,我已经过了必须检查几乎每行代码的可操作性的阶段。 但是,当我切换到调试时,这10秒钟开始发挥实际作用。 这种调试的过程如下所示:

  • 加2行
  • Pushu提交
  • 我等十秒钟
  • 检查,看看有什么问题
  • 重覆

根据粗略的估计,一个可合并的分支大约有20%的有用提交和80%的调试提交。 假设我用300次提交完成了一个分支的工作,其中240次提交实际上只消耗了我40分钟的工作时间(而这仅仅是分支装配的等待时间,没有考虑加起来的分钟数,即添加2行)然后删除它们)。

图片

在某种程度上,我对此感到厌倦,因此决定配置xDebug以使调试过程的成本降低。 不幸的是,我目前的同事们没有使用这种技术(我在等一个“我有一家很酷的公司,没人使用xDebug”的笑话),或者他们不知道/不记得在分支机构如何与xDebug IDE交朋友通过CI进行远程操作,并且由于我从没有devOps,并且如上所述,所以设置过程对我来说是一个痛苦的过程,它花费了大约6个小时的纯时间,因此最终它起作用了,并且我理解了该过程,这样就足够方便了。

设定程序


通常,我不会详细介绍如何固定CI,Docker,以及如何组装基础架构,假定已完成所有工作,剩下的一切只是建立您的个人环境。

假设我们的存储库具有以下结构:

图片

首先,我们需要检查xDebug本身是否在当前映像中,为此,您可以使用phpinfo();

如果xDebug已包含在程序集中-很好,如果没有,请查看此源 ,它直接对设置本身有帮助,但是,我采取了一些不同的方法。

配置php.ini


为了最终一切正常,两个xDebug设置对我们很重要:

  • xdebug.remote_enable
  • xdebug.remote_host

在远程分支的最终组装中,必须启用remote_enable ,并且必须在remote_host中分配计算机在网络上的IP。 让我们在构建中包括这些设置。

首先,您需要找出php设置的存储位置,它们可以位于/usr/local/etc/php/conf.d/php.ini中 ,或者.ini文件本身的名称可以不同,在我的情况下为/ usr / local /等/ php / conf.d / php-settings.ini 。 您可以从所收集图像的设置中查找。

我们通过相同的php-settings.ini文件在分支中创建其他设置,并将其放置在./build_env/php/php-settings.ini中
我们在上面的设置中写入2个:
xdebug.remote_enable = on
xdebug.remote_host = IP...


接下来,我们需要将此文件添加到“父”图像设置中。 我通过将行添加到./build_env/docker-compose/docker-compose.tmpl中来完成此操作:
- ${PROJECT_DIR}/build_env/php/php-settings.ini:/usr/local/etc/php/conf.d/php-settings.ini

这是docker-compose.tmpl在我的项目中的样子:

图片

下次构建分支时,可以检查是否通过相同的phpinfo()绑定了新设置 如果是的话-非常好,如果不是-您不走运,您将不得不像我第一次做的那样:(

在PHPstorm中自定义映射


接下来,您需要配置PHPstorm本身。 我决定不使用DBgp代理,以免每次都不在弹出窗口中配置映射。 就我而言,我使用的服务器模板将包含必要的映射。

转到设置/首选项| 语言和框架| Php | 伺服器

  1. 创建服务器模板
  2. 姓名:BRANCH
  3. 主持人:任何,不影响
  4. 端口:任何,不影响
  5. 调试器:xDebug
  6. 放任使用路径映射
  7. 我们放下适当的映射,工作的本地文件夹应与收集的分支所在的服务器上的文件夹相对应,在我的情况下,收集的内部版本位于/ var / www / builds / your_namespace / your_project / your_branch文件夹中

图片

我们保存这些设置,每次使用新分支时都将对其进行更改。 例如,如果今天我使用web-2233分支,则将映射更改为/ var / www / builds / build_path / web-2233

添加一个新的环境变量,以便IDE自动提取映射


现在是一个很重要但不是最明显的观点。 当我们开始调试时,PHPstorm需要了解哪些本地文件与远程服务器上的文件相对应。 如果服务器未进行特定安装,则会显示一个弹出窗口,您需要在其中手动映射路径。 为了使PHPstorm立即从名称为BRANCH的服务器获取映射,您需要将PHP_IDE_CONFIG环境变量添加到我们的程序集中

./build_env/docker-compose/docker-compose.tmpl中,在环境中创建一个新的环境变量:
PHP_IDE_CONFIG: ${PHP_IDE_CONFIG}

图片

.gitlab-ci.yml中,我们设置以下变量:
- export PHP_IDE_CONFIG="serverName=BRANCH"

图片

做完了!


我们不需要浏览器扩展,不需要传递URL XDEBUG_SESSION_START = IDE_KEY来获取参数,我们不需要添加其他配置。

只需打开窃听 图片 并刷新站点页面,当我们偶然发现第一个断点时,应用程序将在其上停止

图片

谢谢您的关注,我希望本文对您有所帮助,并且有人会节省时间,而又不会像我一样踩ke :)

我在初始设置期间使用的来源:
https://gist.github.com/chadrien/c90927ec2d160ffea9c4
https://confluence.jetbrains.com/display/PhpStorm/Docker+Support+in+PhpStorm#DockerSupportinPhpStorm-调试在Docker容器中运行的PHP Web应用程序

Source: https://habr.com/ru/post/zh-CN423337/


All Articles