TwigClockworkDumper.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. /**
  3. * @package Grav\Common\Twig
  4. *
  5. * @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Twig;
  9. use Clockwork\Request\Timeline\Timeline;
  10. use Twig\Profiler\Profile;
  11. /**
  12. * Class TwigClockworkDumper
  13. * @package Grav\Common\Twig
  14. */
  15. class TwigClockworkDumper
  16. {
  17. protected $lastId = 1;
  18. /**
  19. * Dumps a profile into a new rendered views timeline
  20. *
  21. * @param Profile $profile
  22. * @return Timeline
  23. */
  24. public function dump(Profile $profile)
  25. {
  26. $timeline = new Timeline;
  27. $this->dumpProfile($profile, $timeline);
  28. return $timeline;
  29. }
  30. /**
  31. * @param Profile $profile
  32. * @param Timeline $timeline
  33. * @param null $parent
  34. */
  35. public function dumpProfile(Profile $profile, Timeline $timeline, $parent = null)
  36. {
  37. $id = $this->lastId++;
  38. if ($profile->isRoot()) {
  39. $name = $profile->getName();
  40. } elseif ($profile->isTemplate()) {
  41. $name = $profile->getTemplate();
  42. } else {
  43. $name = $profile->getTemplate() . '::' . $profile->getType() . '(' . $profile->getName() . ')';
  44. }
  45. foreach ($profile as $p) {
  46. $this->dumpProfile($p, $timeline, $id);
  47. }
  48. $data = $profile->__serialize();
  49. $timeline->event($name, [
  50. 'name' => $id,
  51. 'start' => $data[3]['wt'] ?? null,
  52. 'end' => $data[4]['wt'] ?? null,
  53. 'data' => [
  54. 'data' => [],
  55. 'memoryUsage' => $data[4]['mu'] ?? null,
  56. 'parent' => $parent
  57. ]
  58. ]);
  59. }
  60. }