phpstrom、laradock、xdebug 进行断点调试

2023-11-19

phpstrom、laradock、xdebug 进行断点调试

背景:
  1. laravel 框架封装太完善,经常搞不明白究竟用的是哪个类
  2. 复杂一点的算法,使用 dd方法调试时,需要疯狂dd,显得过于鸡肋
调试流程:
  1. 发请求、跑调试代码
  2. 安装 xdebug 扩展的 PHP 检查是否有预期参数,有就交给 xdebug 处理
  3. xdebug 模块根据配置去链接指定主机的特定端口
  4. 然后就开始快乐的调试
我们要做的:
  1. 确定自己需要执行的 PHP 模式,如 cli,php-fpm,或者两者都要
  2. 安装并开启 xdebug 扩展
  3. 配置充当调试客户端的 phpstrom
  4. 开启监听、打断点、运行程序并开始调试
看完教程后的收获有哪些:
  1. 配置与使用 xdebug 功能
  2. phpunit 单元测试
  3. 两种 CLI 解析器的配置办法,如:SSH、docker composer
cli模式配置说明

1、安装 xdebug 扩展,并升级到 3.x 以上版本,如:
进入 workspace 容器,执行 pecl install xdebug-3.1.3 来安装 xdebug,并记下扩展地址
2、配置 xdebug 配置。通过 php --ini 来确定 PHP 配置的目录,在目录中新建或修改 xdebug.ini 配置文件,内容如下:

	zend_extension=扩展地址
	xdebug.mode=debug
	xdebug.client_host=host.docker.internal
	xdebug.client_port=9300
	;xdebug.client_port 开发机监听端口
	xdebug.log =日志文件.log
	;xdebug.log  查看日志的地址,如果权限不足可能会导致创建失败

3、调通PHP单元测试功能,可以参考这篇文章 phpstrom、laradock、phpunit 进行单元测试
4、修改 phpstrom 进行 Xdebug 调试时所监听的端口,需要与 xdebug.client_port填写的参数保持一致,如: 在这里插入图片描述
5、到这里,我大大的 mac 可以了。但是我的却不行。。。通过查看日志,提示主机172.19.0.1解析失败。经过苦苦寻找,发现这个地址是在调试的时候 由 phpstrom 带过去的,结果 xdebug 还用它了,如图:
在这里插入图片描述
既然如此,那么我们就设置一个新值去覆盖它,如图:
在这里插入图片描述
6、再次运行调试代码,就能发现请求带上了设置的参数,鲜花走起 ^_^^_^。小伙伴赶紧去打个断点试试
在这里插入图片描述

php-fpm 模式配置说明

1、安装 xdebug 扩展,并升级到 3.x 以上版本。为了学习更多,我们通过修改 laradock 配置,并重构容器的方式来修改:

  • a. 去到 laradock 目录下,打开 .env 文件,开启如下配置PHP_FPM_INSTALL_XDEBUG=true,并记下 PHP_FPM_XDEBUG_PORT=9003配置的端口值,如:9003
  • b. 重新构建 php-fpm 容器。执行 docker-compose build -d php-fpm构建新镜像,接着执行 docker-compose stop php-fpmdocker-compose rm php-fpm 来停止并删除旧的 php-fpm 容器,最后执行docker-compose up -d php-fpm 来创建新容器
  • c. 使用 docker ps 找到 php-fpm 的 容器ID(我的为 962916a49bdc ),接着执行 docker exec -it 962916a49bdc /bin/bash进入容器并使用 php -v 检查是否已经成功安装扩展。如果成功,会有with Xdebug字样
  • d. 如果 xdebug 版本不是 3.x 以上的,那就执行 pecl upgrade xdebug 来更新,并记下扩展地址

2、设置 xdebug 配置,与 CLI 模式有少许不同,需要额外设置识别参数。通过 php --ini 来确定PHP配置的目录,执行 php --ini |grep xdebug查看目录下是否有 xdebug 相关的配置,仅保留一个配置,并使用如下配置替换掉:

	zend_extension=扩展地址
	xdebug.client_host=host.docker.internal
	xdebug.idekey=PHPSTORM
	xdebug.client_port=9003
	xdebug.mode=debug
	xdebug.log =日志文件.log
	;xdebug.log  查看日志的地址,如果权限不足可能会导致创建失败

此步骤弄完后需要重启 php-fpm 才能让配置生效。如:退出容器并回到 laradock 目录,执行 docker-compose restart php-fpm命令

3、修改 phpstrom 配置,这里的修改有点多,需要耐心点捏
a. 新怎一个名为 laradock 的服务器(设置 -> PHP -> 服务器),如图:
请添加图片描述

提示:记得填写服务器上的绝对路径

b. 新增 docker 配置(设置 -> 构建、执行、部署 -> Docker),如图:
请添加图片描述
c. 添加一个链接 php-fpm 容器的 CLI 解析器(设置 -> PHP),如图:
请添加图片描述

创建后,CLI 解析器会自动命名为 php-fpm

d. 修改新建 CLI 解析器的生命周期为连接到现有容器,如图:
请添加图片描述
e. 添加一个远程调试配置请添加图片描述

此步骤弄完后,调试配置步骤,算是弄完了

4、切换 phpstrom 的调试配置为刚刚创建的 web-debug 配置
在这里插入图片描述
5、给项目 URL 添加 XDEBUG_SESSION=PHPSTORM参数后就可以开始调试
在这里插入图片描述
6、此步骤为提升体验的。由于每次调试都主动添加 XDEBUG_SESSION参数,这很是麻烦,且容易忘记那个参数与值,有以下建议:
a. 如果是使用 post man 进行调试接口的,可以添加一个全局的参数 XDEBUG_SESSION=PHPSTORM
b. 如果是 web 页面的,那就安装 xdebug helper 插件,配置里面的 ide key 为 phpstrom -> PHPSTORM 并保存即可。以后调试,只要把小虫虫图标改为绿色即可,如图:
在这里插入图片描述

错误定位:
  1. 打开 xdebug 扩展日志,以便查找问题
  2. 查看发送请求的参数,是否符合预期
意外问题:
  1. 出问题时,请第一时间查看 xdebug 的错误日志,他可以解决 99% 的问题
  2. 端口被占用时,换一个没有被使用的端口,只要确保 phpstrom 监听的端口 与 xdebug 配置的端口一致即可
  3. 调试时,phpstorm 被触发,日志也正常,却无法正常断点。此时查看调试控制台是否有错误的红色提示。一开始笔者的服务器名称并不是 laradock,然后系统提示没有 laradock 服务器(神奇得很),最后我把服务器的名字修改成为 laradock 就好了。 修改第 3.a 步骤的服务器名字
特别感谢:

感谢,感谢,感谢我亲爱的,敬爱的,耐心十足的 old 大大^_^

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

phpstrom、laradock、xdebug 进行断点调试 的相关文章

  • 在 php 中回显 JSON 数据

    我正在尝试回显一些 JSON 数据 问题是数据包含变量 但我的代码没有将变量放入字符串中 这是我的代码 status row Status priority row Priority echo status status priority
  • PHPExcel输出乱码

    我正在尝试 PHPExcel 附带的简单示例 01simple xls 我得到乱码输出 它 LibreOffice 想要导入文件 它认为字符集是西欧 DOS OS2 861 icelandic 输出是这样的
  • 在订单项目视图中显示自定义产品数据

    我在添加到购物车时遇到问题 我有一个具有不同定制条件的产品可供选择 当客户选择特定选项时 它添加到购物车 当客户选择另一种选择并添加时 它显示为购物车中的第二件商品 这没关系 但付款后 订单在第 1 项和第 2 项下均显示自定义选项 但没有
  • php字符串是值类型吗?

    为什么php的string是值类型 每次将参数传递给函数时 每次进行赋值时 每次连接都会导致字符串被复制时 它都会被复制到各处 我的 NET 经验告诉我 它似乎效率低下 迫使我几乎在任何地方都使用引用 考虑以下替代方案 替代方案1 This
  • Laravel 验证:对 null 的成员函数调用失败()

    这段代码几天前还可以工作 但我似乎做了一些事情导致它崩溃 我有这条路线 Route post admin routemanagement AdminController addRoute 看起来像这样 public function add
  • 如何使用 Angular4 进行 Codeigniter 视图?

    首先 我的 PHP Codeigniter 项目当前在服务器上运行 然后我在服务器上安装了最新的 Angular4 CLI Typescript 但我不知道如何与Codeigniter项目集成 如何像 AngularJS 一样在 Codei
  • 提交表单后重定向是一个好习惯吗?

    我最近开始在提交网站上的某些表单 主要与购物车应用程序相关 后进行 header 重定向 到同一页面 以便用户不会通过刷新页面来执行意想不到的操作或者 后退 或 前进 并刷新页面 这是可以接受的做法吗 这是标准做法 称为redirect a
  • 在另一列中查找重复值时,如何将列数据存储为逗号分隔值? [复制]

    这个问题在这里已经有答案了 如果任何公司的产品都相同 我必须组合或内爆子数组值 预期输出应该类似于 0 gt array company gt 1 6 product gt 5 我的数组是 array 0 gt array company
  • 通过自定义文本更改库存文本中的 WooCommerce 产品可用性

    我想更改库存数量后面的 有库存 文字 我尝试在我的 WordPress php 编辑器中添加此 PHP 代码 但它不起作用 你知道为什么吗 谢谢 add filter woocommerce get availability text bb
  • 区分 Web 路由调用与 API 路由调用?

    In my web php文件中 我有一条如下所示的路线 Route get HomeController getFeed 而在我的api php文件中 我有一条如下所示的路线 Route get feeds HomeController
  • 禁用选择标签内的一个选项值在 IE6Ha 中不起作用[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个包含 4 个值 a b c d 的选择框 我只想禁用下拉列表中的 c 我使用了禁用属性 它在所有浏览器中都有效 但在 IE6
  • Laravel 5.4 密码重置

    我有一个 Laravel 5 4 应用程序 我的管理区域中有一个视图 允许我查看所有用户 我想创建一个功能 允许我单击后端的按钮 自动发送默认 Laravel 密码重置功能的过程 在我看来 我有以下几点 table class table
  • Mailgun 内联图像,它是如何工作的?

    我正在使用 mailgun 并希望将图像添加到我的时事通讯中 现在我这样做了 mg gt sendMessage domain array from gt email protected cdn cgi l email protection
  • json_decode 返回 null 并带有不同的引号

    json decode foo bar true 这有效 但是这个返回NULL json decode foo bar true The json last error 输出4 JSON ERROR SYNTAX 我检查了以下问题的一些答案
  • 如何将从 MySQL 获取的数据以 JSON 形式返回到 php 文件中?

    我必须将从 MySQL 表中获取的数据作为 JSON 返回到 php 文件中 这是我连接到 mysql 并从中获取数据的代码 现在我怎么能将它作为 JSON 返回呢
  • 为什么 symfony DOMCrawler 对象无法在依赖的 phpunit 测试之间正确传递?

    我有一个适用于我的 symfony 应用程序的 phpunit 测试套件 在该测试文件中 我在不同的测试之间有一些依赖关系 并在依赖关系之间传递一个 DOMCrawler 对象 这样我就不必每次都导航到它 但是 在采用我所做的方法时 您似乎
  • 如何通过htaccess在codeigniter中隐藏index.php和控制器名称

    我想从我的 codeignier url 网站隐藏 index php 和控制器名称 我也想替换这个术语 seo test product ad test product 我在下面提到了我的 htaccess 文件 请指导我如何解决这个问题
  • Kubernetes Web UI(仪表板)缺少图表

    我已经使用 Kubeadm v1 6 安装了 Docker v1 13 和 Kubernetes 然后我安装了 Web UI 仪表板 我可以访问它 但缺少 CPU 内存使用图 为什么会发生这种情况 对我来说 安装后使用图就起作用了heaps
  • 自定义 php 论坛 - 显示新的/未读的帖子

    我自己使用 php 编写了一个自定义论坛脚本 我决定不使用 phpbb 和其他工具 因为我希望我所做的事情具有 100 的灵活性 不过我遇到了一个问题 如何向用户显示帖子是否是新的 未读的 我想到了两种解决方案 1 饼干 2 数据库 我不想
  • Google Analytics PHP(发送信息)

    大意 我正在开发一个项目 我需要使用 Google Analytics 服务器端 我不需要检索信息 但我需要发送信息 我最终可以发送 js 脚本客户端 但在这种情况下它不是一个选项 以下大多数链接都非常旧 2012年 检索 不是我需要的 我

随机推荐

  • FISCO BCOS 2.0新特性解读

    FISCO BCOS是完全开源的联盟区块链底层技术平台 由金融区块链合作联盟 深圳 简称金链盟 成立开源工作组通力打造 开源工作组成员包括博彦科技 华为 深证通 神州数码 四方精创 腾讯 微众银行 亦笔科技和越秀金科等金链盟成员机构 代码仓
  • Nacos、ZooKeeper和Dubbo的区别

    Nacos ZooKeeper和Dubbo是三个不同的分布式系统组件 它们之间有以下几点区别 功能定位 Nacos主要提供服务发现 配置管理和服务治理等功能 而ZooKeeper主要是分布式协调服务 提供了分布式锁 分布式队列等原语 Dub
  • 本地部署LLaMA-中文LoRA部署详细说明

    在Ubuntu18 04 部署中文LLaMA模型 环境准备 硬件环境 AMD 5950X 128GB RAM RTX 3090 24G VRAM 操作系统 Ubuntu 18 04 编译环境 可选 llama cpp 编译 cd llama
  • GoJS学习

    简介 GoJS是一个可视化JavaScript库 用于浏览器中创建交互图形 比如流程图 树图 关系图 力导图等等 GoJS不依赖于任何JS库或框架 例如bootstrap jquery等 可与任何HTML或JS框架配合工作 甚至可以不用框架
  • Cuda 代码中的 函数前缀 device global host 使用

    众所周知 CUDA并行可以使代码加速很多倍 其文件类型为 cu 结尾 在编写cu 文件时 常用的函数前缀关键字有 device global host host C或者C 中相同 是由CPU调用 由CPU执行的函数 global 表示一个内
  • 为啥国内互联网公司都用centos而不是ubuntu?

    一直以来都很好奇ubuntu和centos有啥区别 上学时接触的都是ubuntu 自己每次装virtual box的时候都会下个ubuntu 但是公司的服务器上装的都是centos 今天查了下知乎网友的精彩回答 呵呵 简单总结下主要有几个原
  • 解释执行与编译执行语言有什么区别?

    一 主体不同 1 编译执行 由编译程序将目标代码一次性编译成目标程序 再由机器运行目标程序 2 解释执行 将源语言直接作为源程序输入 解释执行 解释一句后就提交计算机执行一句 并不形成目标程序 二 优势不同 1 编译执行 相比解释执行编译执
  • 常用的偏微分方程

    偏微分方程通常包含两个以上的自变量 若自变量同时间相关 或者无关 称其为发展型 或者稳态 的 下面 我们罗列出一些典型的偏微分方程 如 热传导方程 一阶双曲守恒律方程 二阶波动方程 椭圆型偏微分方程等 抛物型偏微分方程通常刻画 个物理系统的
  • 前端学科面试题大全

    作用域和值类型引用类型的传递 变量作用域 作用域变量访问区域 变量值存在栈中 变量赋值相当于值赋值 值传递与引用传递有哪些区别 函数内部 变量会先声明 形式参数变量声明提升 整个函数体有var声明的变量 如果没有访问全局定义的num2 函数
  • 服务器环境初始化配置

    工程实践经验积累 服务器环境初始化配置 1 新建环境 新建环境 是为了使自己的程序在一个相对独立的环境中运行 不影响服务器上其他用户 并不受其他用户影响 新建环境的语句为 conda create n your env name pytho
  • 【Unity Shader】屏幕后处理1.0:调整亮度/饱和度/对比度

    1 Unity中实现屏幕特效的基本步骤 什么叫屏幕后处理 Screen post processing effects 渲染完整个场景得到屏幕图像后对图像进行一系列操作 实现各种屏幕特效 这一步我们可以添加很多例如景深 Depth of F
  • session销毁

    session invalidate session invalidate的销毁是把这个session所带的用户彻底的销毁 这个session跟用户已经紧密联合在一起 所以就一起销毁了 这样就算换了个session 也是登陆不了的 以前我的
  • 设计模式之享元模式

    享元模式 就是共享技术 对于系统中存在大量相同的对象 把他们抽取成一个对象放在缓存中进行使用 这样可以大大节省系统资源 例如 围棋棋盘上有两种棋子 一个是黑子 一个是白子 如果在下棋的时候每下一个棋子就要new一个棋子对象 那么就会有大量的
  • C#比较两个list集合,两集合同时存在或A集合存在B集合中无

    using System using System Collections Generic using System Linq using System Text using System Threading using System Th
  • iOS灵动岛【电商秒杀】开发实践

    一 基本概述 名词基础知识 苹果在 iPhone 14 Pro 系列中增加一个灵动岛 主要目的是隐藏挖孔造型的高端 感叹号屏 通过动画的视觉差异 用户找不到原来的挖孔屏 灵动岛是一种巧妙的设计 模糊了软件和硬件之间的界限 它可以在锁屏的情况
  • Python: 转换文本编码

    最近在做周报的时候 需要把csv文本中的数据提取出来制作表格后生产图表 在获取csv文本内容的时候 基本上都是用with open filename encoding UTF 8 as f 来打开csv文本 但是实际使用过程中发现有些csv
  • python网络爬虫实战——实时抓取西刺免费代理ip

    参考网上高手示例程序 利用了多线程技术 Python版本为2 7 coding utf8 import urllib2 import re import threading import time rawProxyList checkedP
  • Git切换分支报错:error: you need to resolve your current index first 以及needs merge

    当想从子分支切换到dev分支时git checkout dev 报错 error you need to resolve your current index first xxx java needs merge xxx xml needs
  • c#:ThreadPool实现并行分析,并实现线程同步结束

    背景 一般情况下 经常会遇到一个单线程程序时执行对CPU MEMORY IO利用率上不来 且速度慢下问题 那么 怎么解决这些问题呢 据我个人经验来说有以下两种方式 1 并行 多线程 Parallel Task ThreadPool 2 多进
  • phpstrom、laradock、xdebug 进行断点调试

    phpstrom laradock xdebug 进行断点调试 背景 laravel 框架封装太完善 经常搞不明白究竟用的是哪个类 复杂一点的算法 使用 dd方法调试时 需要疯狂dd 显得过于鸡肋 调试流程 发请求 跑调试代码 安装 xde