调试您的应用程序
替换 var_dump
虽然使用 XDebug 和一个好的 IDE 对调试您的应用程序至关重要,但有时一个简单的 var_dump()
就足够了。CodeIgniter 通过捆绑出色的 Kint PHP 调试工具,使这变得更加出色。这远远超出了您通常的工具,提供了许多替代数据,例如将时间戳格式化为可识别的日期,将十六进制代码显示为颜色,像表格一样显示数组数据以方便阅读,等等。
启用 Kint
默认情况下,Kint 仅在 **开发** 和 **测试** 环境 中启用。只要定义了常量 CI_DEBUG
且其值为真,它就会被启用。这在引导文件中定义(例如 **app/Config/Boot/development.php**)。
使用 Kint
d()
d()
方法将它知道的所有关于作为唯一参数传递给屏幕的内容的数据转储,并允许脚本继续执行
<?php
d($_SERVER);
dd()
此方法与 d()
相同,不同之处在于它还会 die()
,并且此请求不会执行任何其他代码。
trace()
这将提供当前执行点的回溯,并带有 Kint 独有的风格。
<?php
trace();
有关更多信息,请参阅 Kint 页面。
调试工具栏
调试工具栏提供有关当前页面请求的概览信息,包括基准测试结果、您运行的查询、请求和响应数据等等。这在开发过程中非常有用,可以帮助您调试和优化。
注意
调试工具栏仍在开发中,一些计划的功能尚未实现。
启用工具栏
工具栏在任何 环境 中默认启用,除了 生产 环境。只要定义了常量 CI_DEBUG
且其值为真,就会显示它。这在引导文件(例如 app/Config/Boot/development.php)中定义,可以在那里修改以确定要显示的环境。
注意
当您的 baseURL
设置(在 app/Config/App.php 或 .env 中的 app.baseURL
)与您的实际 URL 不匹配时,不会显示工具栏。
工具栏本身显示为一个 后置过滤器。您可以通过将其从 app/Config/Filters.php 的 $globals
属性中删除来阻止它运行。
选择要显示的内容
CodeIgniter 附带了几个收集器,顾名思义,它们收集数据以在工具栏上显示。您可以轻松地创建自己的收集器来自定义工具栏。要确定显示哪些收集器,请再次转到 app/Config/Toolbar.php 配置文件
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Toolbar extends BaseConfig
{
public $collectors = [
\CodeIgniter\Debug\Toolbar\Collectors\Timers::class,
\CodeIgniter\Debug\Toolbar\Collectors\Database::class,
\CodeIgniter\Debug\Toolbar\Collectors\Logs::class,
\CodeIgniter\Debug\Toolbar\Collectors\Views::class,
\CodeIgniter\Debug\Toolbar\Collectors\Cache::class,
\CodeIgniter\Debug\Toolbar\Collectors\Files::class,
\CodeIgniter\Debug\Toolbar\Collectors\Routes::class,
\CodeIgniter\Debug\Toolbar\Collectors\Events::class,
];
// ...
}
注释掉您不想显示的任何收集器。通过提供完全限定的类名在此处添加自定义收集器。此处出现的精确收集器将影响显示哪些选项卡,以及在时间轴上显示哪些信息。
注意
某些选项卡,如数据库和日志,只有在有内容要显示时才会显示。否则,它们会被移除,以帮助在较小的显示器上显示。
与 CodeIgniter 一起提供的收集器有
计时器收集所有基准数据,包括系统和应用程序。
数据库显示所有数据库连接执行的查询列表及其执行时间。
日志将显示所有记录的信息。在长时间运行的系统或记录许多项目的系统中,这会导致内存问题,应禁用。
视图在时间轴上显示视图的渲染时间,并在单独的选项卡上显示传递给视图的任何数据。
缓存将显示有关缓存命中和未命中的信息以及执行时间。
文件显示此请求期间加载的所有文件的列表。
路由显示有关当前路由和系统中定义的所有路由的信息。
事件显示此请求期间加载的所有事件的列表。
设置基准点
为了使分析器编译和显示您的基准数据,您必须使用特定的语法命名您的标记点。
请阅读基准库页面中关于设置基准点的信息。
创建自定义收集器
创建自定义收集器是一项简单的任务。您创建一个新的类,完全命名空间,以便自动加载器可以找到它,该类扩展了CodeIgniter\Debug\Toolbar\Collectors\BaseCollector
。这提供了一些您可以覆盖的方法,并且有四个必需的类属性,您必须根据您希望收集器的工作方式正确设置它们
<?php
namespace MyNamespace;
use CodeIgniter\Debug\Toolbar\Collectors\BaseCollector;
class MyCollector extends BaseCollector
{
protected $hasTimeline = false;
protected $hasTabContent = false;
protected $hasVarData = false;
protected $title = '';
}
$hasTimeline应设置为true
,用于任何希望在工具栏时间轴中显示信息的收集器。如果为真,您需要实现formatTimelineData()
方法来格式化和返回要显示的数据。
$hasTabContent应为true
,如果收集器希望使用自定义内容显示自己的选项卡。如果为真,您需要提供一个$title
,实现display()
方法来呈现选项卡的内容,并且可能需要实现getTitleDetails()
方法,如果您想在选项卡内容标题的右侧显示其他信息。
$hasVarData 应该为 true
,如果该收集器想要向 Vars
选项卡添加额外数据。如果为真,则需要实现 getVarData()
方法。
$title 显示在打开的选项卡上。
显示工具栏选项卡
要显示工具栏选项卡,您必须
用显示为工具栏标题和选项卡标题的文本填充
$title
。将
$hasTabContent
设置为true
。实现
display()
方法。可选地,实现
getTitleDetails()
方法。
The display()
创建显示在选项卡本身内的 HTML。它不需要担心选项卡的标题,因为工具栏会自动处理。它应该返回一个 HTML 字符串。
The getTitleDetails()
方法应该返回一个字符串,该字符串显示在选项卡标题的右侧。它可以用来提供额外的概述信息。例如,数据库选项卡显示所有连接的总查询数,而文件选项卡显示文件总数。
提供时间线数据
要提供要显示在时间线中的信息,您必须
将
$hasTimeline
设置为true
。实现
formatTimelineData()
方法。
The formatTimelineData()
方法必须返回一个数组数组,以时间线可以使用的方式进行格式化,以便正确排序并显示正确的信息。内部数组必须包含以下信息
<?php
$data[] = [
'name' => '', // Name displayed on the left of the timeline
'component' => '', // Name of the Component listed in the middle of timeline
'start' => 0.00, // start time, like microtime(true)
'duration' => 0.00, // duration, like mircrotime(true) - microtime(true)
];
提供变量
要将数据添加到“变量”选项卡,您必须
将
$hasVarData
设置为true
实现
getVarData()
方法。
该 getVarData()
方法应返回一个包含键/值对数组的数组,以供显示。外部数组的键名称是“变量”选项卡上部分的名称。
<?php
$data = [
'section 1' => [
'foo' => 'bar',
'bar' => 'baz',
],
'section 2' => [
'foo' => 'bar',
'bar' => 'baz',
],
];
热重载
版本 4.4.0 中新增。
调试工具栏包含一个名为热重载的功能,它允许您对应用程序代码进行更改,并在浏览器中自动重新加载它们,而无需刷新页面。这在开发过程中非常节省时间。
要在开发过程中启用热重载,您可以单击工具栏左侧看起来像刷新图标的按钮。这将为所有页面启用热重载,直到您禁用它。
热重载通过每秒扫描 **app** 目录中的文件并查找更改来工作。如果发现任何更改,它将向浏览器发送一条消息以重新加载页面。它不会扫描任何其他目录,因此,如果您对 **app** 目录之外的文件进行更改,则需要手动刷新页面。
如果您需要监视 **app** 目录之外的文件,或者由于项目大小而发现它很慢,您可以在 **app/Config/Toolbar.php** 配置文件的 $watchedDirectories
和 $watchedExtensions
属性中指定要扫描的目录和要扫描的文件扩展名。