%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br/src/Debug/ |
| Current File : /var/www/projetos/suporte.iigd.com.br/src/Debug/Profiler.php |
<?php
/**
* ---------------------------------------------------------------------
*
* GLPI - Gestionnaire Libre de Parc Informatique
*
* http://glpi-project.org
*
* @copyright 2015-2024 Teclib' and contributors.
* @copyright 2003-2014 by the INDEPNET Development Team.
* @licence https://www.gnu.org/licenses/gpl-3.0.html
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* ---------------------------------------------------------------------
*/
namespace Glpi\Debug;
/**
* Class that handles profiling sections of code.
* The data is viewable in the debug bar only. If the current user is not in debug mode, the profiler is disabled.
*/
final class Profiler
{
/** @var ProfilerSection[] */
private $current_sections = [];
private $disabled = false;
public const CATEGORY_CORE = 'core';
public const CATEGORY_PLUGINS = 'plugins';
public const CATEGORY_DB = 'db';
public const CATEGORY_TWIG = 'twig';
private static $instance;
public static function getInstance(): self
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function disable(): void
{
$this->disabled = true;
}
/**
* Starts a new section in the profiler. This section will be stopped when Profiler::stop() is called with the same name.
* @param string $name The name of the section. This name will be used to stop the section later.
* @param string $category The category of the section. See Profiler::CATEGORY_* for some predefined categories.
* @return void
*/
public function start(string $name, string $category = self::CATEGORY_CORE): void
{
$debug_mode_or_pre_session = !isset($_SESSION['glpi_use_mode']) || $_SESSION['glpi_use_mode'] === \Session::DEBUG_MODE;
if ($this->disabled || !$debug_mode_or_pre_session) {
return;
}
// If any other section is running, this new one will be a child section of the last one
$parent_id = null;
if (count($this->current_sections)) {
$parent_id = array_key_last($this->current_sections);
$parent_id = $this->current_sections[$parent_id]->getId();
}
$this->current_sections[] = new ProfilerSection($category, $name, microtime(true) * 1000, $parent_id);
}
/**
* Stops a section started with Profiler::start()
* @param string $name The name of the section to stop. This name must be the same as the one used in Profiler::start()
* @return void
*/
public function stop(string $name): void
{
// get the last section with the given name and stop it
$section = array_filter($this->current_sections, static function (ProfilerSection $section) use ($name) {
return $section->getName() === $name;
});
if (count($section)) {
$k = array_key_last($section);
$section = array_pop($section);
$section->end(microtime(true) * 1000);
unset($this->current_sections[$k]);
Profile::getCurrent()->setData('profiler', $section->toArray());
}
}
/**
* Stops all running sections
* @return void
*/
public function stopAll(): void
{
foreach ($this->current_sections as $section) {
$this->stop($section->getName());
}
}
/**
* Checks if a section is running
* @param string $name The name of the section to check
* @return bool
*/
public function isRunning(string $name): bool
{
$section = array_filter($this->current_sections, static function (ProfilerSection $section) use ($name) {
return $section->getName() === $name;
});
return count($section) > 0;
}
}