步骤30:发现Symfony内部组件ob娱乐下载

5.2版本
维护 没有维护的

发现Symfony内部ob娱乐下载

我们使用Symfony开发强大的应用程ob娱乐下载序已经有一段时间了,但是应用程序执行的大部分代码都来自Symfony。几百行代码对几千行代码。

我喜欢了解幕后是如何运作的。我一直着迷于那些能帮助我理解事物运作原理的工具。第一次使用分步调试器或者第一次发现ptrace是神奇的记忆。

你想更好地理解Symfony是如何工作的吗?ob娱乐下载现在是时候深入研究Symfony如何让应用ob娱乐下载程序运行了。我们不打算从理论的角度描述Symfony如何处理HTob娱乐下载TP请求,这将非常无聊,我们将使用Blackfire来获得一些可视化表示,并使用它来发现一些更高级的主题。

了解Symfony内部与Blob娱乐下载ackfire

您已经知道,所有HTTP请求都由一个入口点提供服务:公共/ index . php文件。但接下来会发生什么?如何调用控制器?

让我们通过Blackfire浏览器扩展介绍生产中的Blackfire英语主页:

1
$ ob娱乐下载symfony远程:开放

或者直接通过命令行:

1
美元的黑焰旋度ob娱乐下载symfony env: url——第一en /

转到配置文件的“时间线”视图,你应该会看到类似以下内容:

从时间轴上,将鼠标悬停在彩色条上,以获得关于每个调用的更多信息;你会学到很多关于Symfony的工作原理:ob娱乐下载

  • 主要入口点是公共/ index . php
  • 内核:处理()方法处理请求;
  • 它调用HttpKernel它调度一些事件;
  • 第一个事件是RequestEvent
  • ControllerResolver: getController ()方法来确定应该为传入的URL调用哪个控制器;
  • ControllerResolver: getArguments ()方法来确定要传递给控制器的参数(调用参数转换器);
  • ConferenceController:指数()方法被调用,我们的大部分代码都通过这个调用执行;
  • ConferenceRepository: findAll ()方法从数据库获取所有会议(注意通过PDO: __construct ());
  • 树枝\环境::渲染()方法呈现模板;
  • ResponseEventFinishRequestEvent,但似乎没有实际注册侦听器,因为它们执行起来非常快。

时间轴是理解某些代码如何工作的好方法;当你得到一个由别人开发的项目时,这是非常有用的。

现在,在开发环境中从本地机器分析相同的页面:

1
美元的黑焰旋度ob娱乐下载symfony var:出口SYMFONY_PROJECT_DEFAULT_ROUTE_URLen /

打开配置文件。你应该被重定向到调用图视图,因为请求非常快,时间轴将相当空:

你知道是怎么回事吗?HTTP缓存已经启用,因此,我们正在分析Symfony HTTP缓存层。ob娱乐下载由于页面在缓存中,HttpCache \商店:restoreResponse ()正在从其缓存中获取HTTP响应,而控制器永远不会被调用。

中禁用缓存层公共/ index . php就像我们在上一步做的那样,然后再试一次。你可以立即看到这个配置文件看起来非常不同:

主要区别如下:

  • TerminateEvent,在生产中是不可见的,占用了很大比例的执行时间;仔细看,您可以看到这是负责存储请求期间收集的Symfony分析器数据的事件;ob娱乐下载
  • ConferenceController:指数()电话,注意到SubRequestHandler:处理()方法来呈现ESI(这就是为什么我们有两个调用分析器:saveProfile (),一个用于主请求,一个用于ESI)。

探索时间轴以了解更多;切换到调用图视图以获得相同数据的不同表示。

正如我们刚刚发现的,在开发和生产中执行的代码是非常不同的。开发环境变慢了,因为Symfony分析器试图收集许多数据来缓解调试问题。ob娱乐下载这就是为什么您应该始终使用生产环境进行概要分析,即使是在本地。

一些有趣的实验:分析一个错误页面,分析/页面(这是一个重定向),或API资源。每个概要文件都将告诉您更多关于Symfony如何工作、调用了哪个类/方法、运行什么代价高、什么代ob娱乐下载价低的信息。

使用Blackfire调试插件

默认情况下,Blackfire会删除所有不重要的方法调用,以避免大的有效负载和大的图。当使用Blackfire作为调试工具时,最好保留所有调用。这由调试插件提供。

在命令行中,使用——调试国旗:

1 2
$ blackfire——调试curlob娱乐下载symfony var:出口SYMFONY_PROJECT_DEFAULT_ROUTE_URL/ /调试curlob娱乐下载symfony env: url——第一en /

在生产中,您会看到加载一个名为.env.local.php

它从何而来?ob娱乐下载sob直播appymfycloud在部署Symfony应用程序时做了一些优化,比如优化Composer自动加载器(——optimize-autoloader——apcu-autoloader——classmap-authoritative).中定义的环境变量也可以优化.env文件(以避免为每个请求解析文件)通过生成.env.local.php文件:

1
$ ob娱乐下载symfony运行composer dump-env prod

Blackfire是一个非常强大的工具,可以帮助理解PHP如何执行代码。提高性能只是使用分析器的一种方法。

在Xdebug中使用步骤调试器

Blackfire时间线和调用图允许开发人员可视化哪些文件/函数/方法是由PHP引擎执行的,以更好地理解项目的代码库。

跟踪代码执行的另一种方法是使用一步调试器就像Xdebug.步骤调试器允许开发人员交互地遍历PHP项目代码,以调试控制流和检查数据结构。它对于调试意外行为非常有用,它取代了常见的“var_dump()/exit()”调试技术。

首先,安装xdebugPHP扩展。执行如下命令检查是否安装成功。

1
$ ob娱乐下载symfony PHP -v

你应该在输出中看到Xdebug:

1 2 3 4 5 6
PHP 8.0.1 (cli) (built: Jan 13 2021 08:22:35) (NTS) Copyright (c) The PHP Group Zend Engine v4.0.1, Copyright (c) Zend Technologies with Zend OPcache v8.0.1, Copyright (c), by Zend Technologies与Xdebug v3.0.2,版权所有(c) 2002-2021, Derick Rethans与blackfire v1.49.0~linux-x64-non_zts80, https://blackfire.io,由blackfire

你也可以检查Xdebug是否为PHP-FPM打开,当鼠标悬停在web调试工具栏的Symfony logo上时,点击" View phpinfo() "链接:ob娱乐下载

现在,让调试Xdebug方式:

php . ini
1 2 3
(xdebug)xdebug.mode调试xdebug.start_with_request是的

默认情况下,Xdebug将数据发送到本地主机的9003端口。

触发Xdebug有很多方法,但最简单的是在IDE中使用Xdebug。在本章中,我们将使用Visual Studio Code来演示它是如何工作的。安装PHP调试扩展,启动“快速打开”功能(Ctrl + P),粘贴以下命令,并按回车键:

1
ext安装felixfbecker.php-debug

创建以下配置文件:

.vscode / launch.json
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
“版本”“0.2.0”“配置”“名称”XDebug“听”“类型”“php”“请求”“启动”“端口”9003},“名称”“启动当前打开的脚本”“类型”“php”“请求”“启动”“程序”" $ {file} "“鹿”" $ {fileDirname} "“端口”9003

从Visual Studio Code,当在你的项目目录中,去调试器,并点击绿色播放按钮标签为“Listen for Xdebug”:

. . / _images / vs-xdebug-run.png

如果您转到浏览器并刷新,IDE应该自动占据焦点,这意味着调试会话已经准备好了。默认情况下,一切都是断点,所以执行在第一条指令时停止。然后,就由您来检查当前变量、步进代码、步进代码……

在调试时,您可以取消勾选“Everything”断点,并在代码中显式设置断点。

如果您是步进调试器的新手,请阅读优秀的Visual Studio代码教程它可以直观地解释一切。


这个工作,包括代码示例,是根据知识共享BY-NC-SA 4.0许可证。