Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

DumpDataCollector.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 11.36 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace Symfony\Component\HttpKernel\DataCollector;
 013   
 014  use Symfony\Component\HttpFoundation\Request;
 015  use Symfony\Component\HttpFoundation\RequestStack;
 016  use Symfony\Component\HttpFoundation\Response;
 017  use Symfony\Component\Stopwatch\Stopwatch;
 018  use Symfony\Component\VarDumper\Cloner\Data;
 019  use Symfony\Component\VarDumper\Cloner\VarCloner;
 020  use Symfony\Component\VarDumper\Dumper\CliDumper;
 021  use Symfony\Component\VarDumper\Dumper\HtmlDumper;
 022  use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
 023   
 024  /**
 025   * @author Nicolas Grekas <p@tchwork.com>
 026   */
 027  class DumpDataCollector extends DataCollector implements DataDumperInterface
 028  {
 029      private $stopwatch;
 030      private $fileLinkFormat;
 031      private $dataCount = 0;
 032      private $isCollected = true;
 033      private $clonesCount = 0;
 034      private $clonesIndex = 0;
 035      private $rootRefs;
 036      private $charset;
 037      private $requestStack;
 038      private $dumper;
 039      private $dumperIsInjected;
 040   
 041      public function __construct(Stopwatch $stopwatch = null, $fileLinkFormat = null, $charset = null, RequestStack $requestStack = null, DataDumperInterface $dumper = null)
 042      {
 043          $this->stopwatch = $stopwatch;
 044          $this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
 045          $this->charset = $charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8';
 046          $this->requestStack = $requestStack;
 047          $this->dumper = $dumper;
 048          $this->dumperIsInjected = null !== $dumper;
 049   
 050          // All clones share these properties by reference:
 051          $this->rootRefs = array(
 052              &$this->data,
 053              &$this->dataCount,
 054              &$this->isCollected,
 055              &$this->clonesCount,
 056          );
 057      }
 058   
 059      public function __clone()
 060      {
 061          $this->clonesIndex = ++$this->clonesCount;
 062      }
 063   
 064      public function dump(Data $data)
 065      {
 066          if ($this->stopwatch) {
 067              $this->stopwatch->start('dump');
 068          }
 069          if ($this->isCollected) {
 070              $this->isCollected = false;
 071          }
 072   
 073          $trace = DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS;
 074          if (PHP_VERSION_ID >= 50400) {
 075              $trace = debug_backtrace($trace, 7);
 076          } else {
 077              $trace = debug_backtrace($trace);
 078          }
 079   
 080          $file = $trace[0]['file'];
 081          $line = $trace[0]['line'];
 082          $name = false;
 083          $fileExcerpt = false;
 084   
 085          for ($i = 1; $i < 7; ++$i) {
 086              if (isset($trace[$i]['class'], $trace[$i]['function'])
 087                  && 'dump' === $trace[$i]['function']
 088                  && 'Symfony\Component\VarDumper\VarDumper' === $trace[$i]['class']
 089              ) {
 090                  $file = $trace[$i]['file'];
 091                  $line = $trace[$i]['line'];
 092   
 093                  while (++$i < 7) {
 094                      if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos($trace[$i]['function'], 'call_user_func')) {
 095                          $file = $trace[$i]['file'];
 096                          $line = $trace[$i]['line'];
 097   
 098                          break;
 099                      } elseif (isset($trace[$i]['object']) && $trace[$i]['object'] instanceof \Twig_Template) {
 100                          $template = $trace[$i]['object'];
 101                          $name = $template->getTemplateName();
 102                          $src = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : false);
 103                          $info = $template->getDebugInfo();
 104                          if (isset($info[$trace[$i - 1]['line']])) {
 105                              $line = $info[$trace[$i - 1]['line']];
 106                              $file = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getPath() : null;
 107   
 108                              if ($src) {
 109                                  $src = explode("\n", $src);
 110                                  $fileExcerpt = array();
 111   
 112                                  for ($i = max($line - 3, 1), $max = min($line + 3, count($src)); $i <= $max; ++$i) {
 113                                      $fileExcerpt[] = '<li'.($i === $line ? ' class="selected"' : '').'><code>'.$this->htmlEncode($src[$i - 1]).'</code></li>';
 114                                  }
 115   
 116                                  $fileExcerpt = '<ol start="'.max($line - 3, 1).'">'.implode("\n", $fileExcerpt).'</ol>';
 117                              }
 118                          }
 119                          break;
 120                      }
 121                  }
 122                  break;
 123              }
 124          }
 125   
 126          if (false === $name) {
 127              $name = str_replace('\\', '/', $file);
 128              $name = substr($name, strrpos($name, '/') + 1);
 129          }
 130   
 131          if ($this->dumper) {
 132              $this->doDump($data, $name, $file, $line);
 133          }
 134   
 135          $this->data[] = compact('data', 'name', 'file', 'line', 'fileExcerpt');
 136          ++$this->dataCount;
 137   
 138          if ($this->stopwatch) {
 139              $this->stopwatch->stop('dump');
 140          }
 141      }
 142   
 143      public function collect(Request $request, Response $response, \Exception $exception = null)
 144      {
 145          // Sub-requests and programmatic calls stay in the collected profile.
 146          if ($this->dumper || ($this->requestStack && $this->requestStack->getMasterRequest() !== $request) || $request->isXmlHttpRequest() || $request->headers->has('Origin')) {
 147              return;
 148          }
 149   
 150          // In all other conditions that remove the web debug toolbar, dumps are written on the output.
 151          if (!$this->requestStack
 152              || !$response->headers->has('X-Debug-Token')
 153              || $response->isRedirection()
 154              || ($response->headers->has('Content-Type') && false === strpos($response->headers->get('Content-Type'), 'html'))
 155              || 'html' !== $request->getRequestFormat()
 156              || false === strripos($response->getContent(), '</body>')
 157          ) {
 158              if ($response->headers->has('Content-Type') && false !== strpos($response->headers->get('Content-Type'), 'html')) {
 159                  $this->dumper = new HtmlDumper('php://output', $this->charset);
 160              } else {
 161                  $this->dumper = new CliDumper('php://output', $this->charset);
 162              }
 163   
 164              foreach ($this->data as $dump) {
 165                  $this->doDump($dump['data'], $dump['name'], $dump['file'], $dump['line']);
 166              }
 167          }
 168      }
 169   
 170      public function serialize()
 171      {
 172          if ($this->clonesCount !== $this->clonesIndex) {
 173              return 'a:0:{}';
 174          }
 175   
 176          $this->data[] = $this->fileLinkFormat;
 177          $this->data[] = $this->charset;
 178          $ser = serialize($this->data);
 179          $this->data = array();
 180          $this->dataCount = 0;
 181          $this->isCollected = true;
 182          if (!$this->dumperIsInjected) {
 183              $this->dumper = null;
 184          }
 185   
 186          return $ser;
 187      }
 188   
 189      public function unserialize($data)
 190      {
 191          parent::unserialize($data);
 192          $charset = array_pop($this->data);
 193          $fileLinkFormat = array_pop($this->data);
 194          $this->dataCount = count($this->data);
 195          self::__construct($this->stopwatch, $fileLinkFormat, $charset);
 196      }
 197   
 198      public function getDumpsCount()
 199      {
 200          return $this->dataCount;
 201      }
 202   
 203      public function getDumps($format, $maxDepthLimit = -1, $maxItemsPerDepth = -1)
 204      {
 205          $data = fopen('php://memory', 'r+b');
 206   
 207          if ('html' === $format) {
 208              $dumper = new HtmlDumper($data, $this->charset);
 209          } else {
 210              throw new \InvalidArgumentException(sprintf('Invalid dump format: %s', $format));
 211          }
 212          $dumps = array();
 213   
 214          foreach ($this->data as $dump) {
 215              if (method_exists($dump['data'], 'withMaxDepth')) {
 216                  $dumper->dump($dump['data']->withMaxDepth($maxDepthLimit)->withMaxItemsPerDepth($maxItemsPerDepth));
 217              } else {
 218                  // getLimitedClone is @deprecated, to be removed in 3.0
 219                  $dumper->dump($dump['data']->getLimitedClone($maxDepthLimit, $maxItemsPerDepth));
 220              }
 221              $dump['data'] = stream_get_contents($data, -1, 0);
 222              ftruncate($data, 0);
 223              rewind($data);
 224              $dumps[] = $dump;
 225          }
 226   
 227          return $dumps;
 228      }
 229   
 230      public function getName()
 231      {
 232          return 'dump';
 233      }
 234   
 235      public function __destruct()
 236      {
 237          if (0 === $this->clonesCount-- && !$this->isCollected && $this->data) {
 238              $this->clonesCount = 0;
 239              $this->isCollected = true;
 240   
 241              $h = headers_list();
 242              $i = count($h);
 243              array_unshift($h, 'Content-Type: '.ini_get('default_mimetype'));
 244              while (0 !== stripos($h[$i], 'Content-Type:')) {
 245                  --$i;
 246              }
 247   
 248              if ('cli' !== PHP_SAPI && stripos($h[$i], 'html')) {
 249                  $this->dumper = new HtmlDumper('php://output', $this->charset);
 250              } else {
 251                  $this->dumper = new CliDumper('php://output', $this->charset);
 252              }
 253   
 254              foreach ($this->data as $i => $dump) {
 255                  $this->data[$i] = null;
 256                  $this->doDump($dump['data'], $dump['name'], $dump['file'], $dump['line']);
 257              }
 258   
 259              $this->data = array();
 260              $this->dataCount = 0;
 261          }
 262      }
 263   
 264      private function doDump($data, $name, $file, $line)
 265      {
 266          if (PHP_VERSION_ID >= 50400 && $this->dumper instanceof CliDumper) {
 267              $contextDumper = function ($name, $file, $line, $fileLinkFormat) {
 268                  if ($this instanceof HtmlDumper) {
 269                      if ($file) {
 270                          $s = $this->style('meta', '%s');
 271                          $name = strip_tags($this->style('', $name));
 272                          $file = strip_tags($this->style('', $file));
 273                          if ($fileLinkFormat) {
 274                              $link = strtr(strip_tags($this->style('', $fileLinkFormat)), array('%f' => $file, '%l' => (int) $line));
 275                              $name = sprintf('<a href="%s" title="%s">'.$s.'</a>', $link, $file, $name);
 276                          } else {
 277                              $name = sprintf('<abbr title="%s">'.$s.'</abbr>', $file, $name);
 278                          }
 279                      } else {
 280                          $name = $this->style('meta', $name);
 281                      }
 282                      $this->line = $name.' on line '.$this->style('meta', $line).':';
 283                  } else {
 284                      $this->line = $this->style('meta', $name).' on line '.$this->style('meta', $line).':';
 285                  }
 286                  $this->dumpLine(0);
 287              };
 288              $contextDumper = $contextDumper->bindTo($this->dumper, $this->dumper);
 289              $contextDumper($name, $file, $line, $this->fileLinkFormat);
 290          } else {
 291              $cloner = new VarCloner();
 292              $this->dumper->dump($cloner->cloneVar($name.' on line '.$line.':'));
 293          }
 294          $this->dumper->dump($data);
 295      }
 296   
 297      private function htmlEncode($s)
 298      {
 299          $html = '';
 300   
 301          $dumper = new HtmlDumper(function ($line) use (&$html) {$html .= $line;}, $this->charset);
 302          $dumper->setDumpHeader('');
 303          $dumper->setDumpBoundaries('', '');
 304   
 305          $cloner = new VarCloner();
 306          $dumper->dump($cloner->cloneVar($s));
 307   
 308          return substr(strip_tags($html), 1, -1);
 309      }
 310  }
 311