| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\Stopwatch;use Symfony\Contracts\Service\ResetInterface;// Help opcache.preload discover always-needed symbolsclass_exists(Section::class);/** * Stopwatch provides a way to profile code. * * @author Fabien Potencier <fabien@symfony.com> */class Stopwatch implements ResetInterface{    /**     * @var bool     */    private $morePrecision;    /**     * @var Section[]     */    private $sections;    /**     * @var Section[]     */    private $activeSections;    /**     * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision     */    public function __construct(bool $morePrecision = false)    {        $this->morePrecision = $morePrecision;        $this->reset();    }    /**     * @return Section[]     */    public function getSections()    {        return $this->sections;    }    /**     * Creates a new section or re-opens an existing section.     *     * @param string|null $id The id of the session to re-open, null to create a new one     *     * @throws \LogicException When the section to re-open is not reachable     */    public function openSection($id = null)    {        $current = end($this->activeSections);        if (null !== $id && null === $current->get($id)) {            throw new \LogicException(sprintf('The section "%s" has been started at an other level and can not be opened.', $id));        }        $this->start('__section__.child', 'section');        $this->activeSections[] = $current->open($id);        $this->start('__section__');    }    /**     * Stops the last started section.     *     * The id parameter is used to retrieve the events from this section.     *     * @see getSectionEvents()     *     * @param string $id The identifier of the section     *     * @throws \LogicException When there's no started section to be stopped     */    public function stopSection($id)    {        $this->stop('__section__');        if (1 == \count($this->activeSections)) {            throw new \LogicException('There is no started section to stop.');        }        $this->sections[$id] = array_pop($this->activeSections)->setId($id);        $this->stop('__section__.child');    }    /**     * Starts an event.     *     * @param string      $name     The event name     * @param string|null $category The event category     *     * @return StopwatchEvent     */    public function start($name, $category = null)    {        return end($this->activeSections)->startEvent($name, $category);    }    /**     * Checks if the event was started.     *     * @param string $name The event name     *     * @return bool     */    public function isStarted($name)    {        return end($this->activeSections)->isEventStarted($name);    }    /**     * Stops an event.     *     * @param string $name The event name     *     * @return StopwatchEvent     */    public function stop($name)    {        return end($this->activeSections)->stopEvent($name);    }    /**     * Stops then restarts an event.     *     * @param string $name The event name     *     * @return StopwatchEvent     */    public function lap($name)    {        return end($this->activeSections)->stopEvent($name)->start();    }    /**     * Returns a specific event by name.     *     * @param string $name The event name     *     * @return StopwatchEvent     */    public function getEvent($name)    {        return end($this->activeSections)->getEvent($name);    }    /**     * Gets all events for a given section.     *     * @param string $id A section identifier     *     * @return StopwatchEvent[]     */    public function getSectionEvents($id)    {        return isset($this->sections[$id]) ? $this->sections[$id]->getEvents() : [];    }    /**     * Resets the stopwatch to its original state.     */    public function reset()    {        $this->sections = $this->activeSections = ['__root__' => new Section(null, $this->morePrecision)];    }}
 |