cache.html.twig 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. {% extends '@WebProfiler/Profiler/layout.html.twig' %}
  2. {% block toolbar %}
  3. {% if collector.totals.calls > 0 %}
  4. {% set icon %}
  5. {{ include('@WebProfiler/Icon/cache.svg') }}
  6. <span class="sf-toolbar-value">{{ collector.totals.calls }}</span>
  7. <span class="sf-toolbar-info-piece-additional-detail">
  8. <span class="sf-toolbar-label">in</span>
  9. <span class="sf-toolbar-value">{{ '%0.2f'|format(collector.totals.time * 1000) }}</span>
  10. <span class="sf-toolbar-label">ms</span>
  11. </span>
  12. {% endset %}
  13. {% set text %}
  14. <div class="sf-toolbar-info-piece">
  15. <b>Cache Calls</b>
  16. <span>{{ collector.totals.calls }}</span>
  17. </div>
  18. <div class="sf-toolbar-info-piece">
  19. <b>Total time</b>
  20. <span>{{ '%0.2f'|format(collector.totals.time * 1000) }} ms</span>
  21. </div>
  22. <div class="sf-toolbar-info-piece">
  23. <b>Cache hits</b>
  24. <span>{{ collector.totals.hits }} / {{ collector.totals.reads }}{% if collector.totals.hit_read_ratio is not null %} ({{ collector.totals.hit_read_ratio }}%){% endif %}</span>
  25. </div>
  26. <div class="sf-toolbar-info-piece">
  27. <b>Cache writes</b>
  28. <span>{{ collector.totals.writes }}</span>
  29. </div>
  30. {% endset %}
  31. {{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { link: profiler_url }) }}
  32. {% endif %}
  33. {% endblock %}
  34. {% block menu %}
  35. <span class="label {{ collector.totals.calls == 0 ? 'disabled' }}">
  36. <span class="icon">
  37. {{ include('@WebProfiler/Icon/cache.svg') }}
  38. </span>
  39. <strong>Cache</strong>
  40. </span>
  41. {% endblock %}
  42. {% block panel %}
  43. <h2>Cache</h2>
  44. {% if collector.totals.calls == 0 %}
  45. <div class="empty">
  46. <p>No cache calls were made.</p>
  47. </div>
  48. {% else %}
  49. <div class="metrics">
  50. <div class="metric">
  51. <span class="value">{{ collector.totals.calls }}</span>
  52. <span class="label">Total calls</span>
  53. </div>
  54. <div class="metric">
  55. <span class="value">{{ '%0.2f'|format(collector.totals.time * 1000) }} <span class="unit">ms</span></span>
  56. <span class="label">Total time</span>
  57. </div>
  58. <div class="metric-divider"></div>
  59. <div class="metric">
  60. <span class="value">{{ collector.totals.reads }}</span>
  61. <span class="label">Total reads</span>
  62. </div>
  63. <div class="metric">
  64. <span class="value">{{ collector.totals.writes }}</span>
  65. <span class="label">Total writes</span>
  66. </div>
  67. <div class="metric">
  68. <span class="value">{{ collector.totals.deletes }}</span>
  69. <span class="label">Total deletes</span>
  70. </div>
  71. <div class="metric-divider"></div>
  72. <div class="metric">
  73. <span class="value">{{ collector.totals.hits }}</span>
  74. <span class="label">Total hits</span>
  75. </div>
  76. <div class="metric">
  77. <span class="value">{{ collector.totals.misses }}</span>
  78. <span class="label">Total misses</span>
  79. </div>
  80. <div class="metric">
  81. <span class="value">
  82. {{ collector.totals.hit_read_ratio ?? 0 }} <span class="unit">%</span>
  83. </span>
  84. <span class="label">Hits/reads</span>
  85. </div>
  86. </div>
  87. <h2>Pools</h2>
  88. <div class="sf-tabs">
  89. {% for name, calls in collector.calls %}
  90. <div class="tab {{ calls|length == 0 ? 'disabled' }}">
  91. <h3 class="tab-title">{{ name }} <span class="badge">{{ collector.statistics[name].calls }}</span></h3>
  92. <div class="tab-content">
  93. {% if calls|length == 0 %}
  94. <div class="empty">
  95. <p>No calls were made for {{ name }} pool.</p>
  96. </div>
  97. {% else %}
  98. <h4>Metrics</h4>
  99. <div class="metrics">
  100. {% for key, value in collector.statistics[name] %}
  101. <div class="metric">
  102. <span class="value">
  103. {% if key == 'time' %}
  104. {{ '%0.2f'|format(1000 * value) }} <span class="unit">ms</span>
  105. {% elseif key == 'hit_read_ratio' %}
  106. {{ value ?? 0 }} <span class="unit">%</span>
  107. {% else %}
  108. {{ value }}
  109. {% endif %}
  110. </span>
  111. <span class="label">{{ key == 'hit_read_ratio' ? 'Hits/reads' : key|capitalize }}</span>
  112. </div>
  113. {% if key == 'time' or key == 'deletes' %}
  114. <div class="metric-divider"></div>
  115. {% endif %}
  116. {% endfor %}
  117. </div>
  118. <h4>Calls</h4>
  119. <table>
  120. <thead>
  121. <tr>
  122. <th>#</th>
  123. <th>Time</th>
  124. <th>Call</th>
  125. <th>Hit</th>
  126. </tr>
  127. </thead>
  128. <tbody>
  129. {% for call in calls %}
  130. <tr>
  131. <td class="font-normal text-small text-muted nowrap">{{ loop.index }}</td>
  132. <td class="nowrap">{{ '%0.2f'|format((call.end - call.start) * 1000) }} ms</td>
  133. <td class="nowrap">{{ call.name }}()</td>
  134. <td>{{ profiler_dump(call.value.result, maxDepth=2) }}</td>
  135. </tr>
  136. {% endfor %}
  137. </tbody>
  138. </table>
  139. {% endif %}
  140. </div>
  141. </div>
  142. {% endfor %}
  143. </div>
  144. {% endif %}
  145. {% endblock %}