* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Stopwatch; /** * Stopwatch provides a way to profile code. * * @author Fabien Potencier */ class Stopwatch { /** * @var Section[] */ private $sections; /** * @var Section[] */ private $activeSections; public function __construct() { $this->sections = $this->activeSections = array('__root__' => new Section(null)); } /** * @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 $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() : array(); } }