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

FileProfilerStorage.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 7.86 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\Profiler;
013   
014  /**
015   * Storage for profiler using files.
016   *
017   * @author Alexandre Salomé <alexandre.salome@gmail.com>
018   */
019  class FileProfilerStorage implements ProfilerStorageInterface
020  {
021      /**
022       * Folder where profiler data are stored.
023       *
024       * @var string
025       */
026      private $folder;
027   
028      /**
029       * Constructs the file storage using a "dsn-like" path.
030       *
031       * Example : "file:/path/to/the/storage/folder"
032       *
033       * @param string $dsn The DSN
034       *
035       * @throws \RuntimeException
036       */
037      public function __construct($dsn)
038      {
039          if (0 !== strpos($dsn, 'file:')) {
040              throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use FileStorage with an invalid dsn "%s". The expected format is "file:/path/to/the/storage/folder".', $dsn));
041          }
042          $this->folder = substr($dsn, 5);
043   
044          if (!is_dir($this->folder) && false === @mkdir($this->folder, 0777, true) && !is_dir($this->folder)) {
045              throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $this->folder));
046          }
047      }
048   
049      /**
050       * {@inheritdoc}
051       */
052      public function find($ip, $url, $limit, $method, $start = null, $end = null)
053      {
054          $file = $this->getIndexFilename();
055   
056          if (!file_exists($file)) {
057              return array();
058          }
059   
060          $file = fopen($file, 'r');
061          fseek($file, 0, SEEK_END);
062   
063          $result = array();
064          while (count($result) < $limit && $line = $this->readLineFromFile($file)) {
065              $values = str_getcsv($line);
066              list($csvToken, $csvIp, $csvMethod, $csvUrl, $csvTime, $csvParent) = $values;
067              $csvStatusCode = isset($values[6]) ? $values[6] : null;
068   
069              $csvTime = (int) $csvTime;
070   
071              if ($ip && false === strpos($csvIp, $ip) || $url && false === strpos($csvUrl, $url) || $method && false === strpos($csvMethod, $method)) {
072                  continue;
073              }
074   
075              if (!empty($start) && $csvTime < $start) {
076                  continue;
077              }
078   
079              if (!empty($end) && $csvTime > $end) {
080                  continue;
081              }
082   
083              $result[$csvToken] = array(
084                  'token' => $csvToken,
085                  'ip' => $csvIp,
086                  'method' => $csvMethod,
087                  'url' => $csvUrl,
088                  'time' => $csvTime,
089                  'parent' => $csvParent,
090                  'status_code' => $csvStatusCode,
091              );
092          }
093   
094          fclose($file);
095   
096          return array_values($result);
097      }
098   
099      /**
100       * {@inheritdoc}
101       */
102      public function purge()
103      {
104          $flags = \FilesystemIterator::SKIP_DOTS;
105          $iterator = new \RecursiveDirectoryIterator($this->folder, $flags);
106          $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST);
107   
108          foreach ($iterator as $file) {
109              if (is_file($file)) {
110                  unlink($file);
111              } else {
112                  rmdir($file);
113              }
114          }
115      }
116   
117      /**
118       * {@inheritdoc}
119       */
120      public function read($token)
121      {
122          if (!$token || !file_exists($file = $this->getFilename($token))) {
123              return;
124          }
125   
126          return $this->createProfileFromData($token, unserialize(file_get_contents($file)));
127      }
128   
129      /**
130       * {@inheritdoc}
131       *
132       * @throws \RuntimeException
133       */
134      public function write(Profile $profile)
135      {
136          $file = $this->getFilename($profile->getToken());
137   
138          $profileIndexed = is_file($file);
139          if (!$profileIndexed) {
140              // Create directory
141              $dir = dirname($file);
142              if (!is_dir($dir) && false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
143                  throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $dir));
144              }
145          }
146   
147          // Store profile
148          $data = array(
149              'token' => $profile->getToken(),
150              'parent' => $profile->getParentToken(),
151              'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
152              'data' => $profile->getCollectors(),
153              'ip' => $profile->getIp(),
154              'method' => $profile->getMethod(),
155              'url' => $profile->getUrl(),
156              'time' => $profile->getTime(),
157          );
158   
159          if (false === file_put_contents($file, serialize($data))) {
160              return false;
161          }
162   
163          if (!$profileIndexed) {
164              // Add to index
165              if (false === $file = fopen($this->getIndexFilename(), 'a')) {
166                  return false;
167              }
168   
169              fputcsv($file, array(
170                  $profile->getToken(),
171                  $profile->getIp(),
172                  $profile->getMethod(),
173                  $profile->getUrl(),
174                  $profile->getTime(),
175                  $profile->getParentToken(),
176                  $profile->getStatusCode(),
177              ));
178              fclose($file);
179          }
180   
181          return true;
182      }
183   
184      /**
185       * Gets filename to store data, associated to the token.
186       *
187       * @param string $token
188       *
189       * @return string The profile filename
190       */
191      protected function getFilename($token)
192      {
193          // Uses 4 last characters, because first are mostly the same.
194          $folderA = substr($token, -2, 2);
195          $folderB = substr($token, -4, 2);
196   
197          return $this->folder.'/'.$folderA.'/'.$folderB.'/'.$token;
198      }
199   
200      /**
201       * Gets the index filename.
202       *
203       * @return string The index filename
204       */
205      protected function getIndexFilename()
206      {
207          return $this->folder.'/index.csv';
208      }
209   
210      /**
211       * Reads a line in the file, backward.
212       *
213       * This function automatically skips the empty lines and do not include the line return in result value.
214       *
215       * @param resource $file The file resource, with the pointer placed at the end of the line to read
216       *
217       * @return mixed A string representing the line or null if beginning of file is reached
218       */
219      protected function readLineFromFile($file)
220      {
221          $line = '';
222          $position = ftell($file);
223   
224          if (0 === $position) {
225              return;
226          }
227   
228          while (true) {
229              $chunkSize = min($position, 1024);
230              $position -= $chunkSize;
231              fseek($file, $position);
232   
233              if (0 === $chunkSize) {
234                  // bof reached
235                  break;
236              }
237   
238              $buffer = fread($file, $chunkSize);
239   
240              if (false === ($upTo = strrpos($buffer, "\n"))) {
241                  $line = $buffer.$line;
242                  continue;
243              }
244   
245              $position += $upTo;
246              $line = substr($buffer, $upTo + 1).$line;
247              fseek($file, max(0, $position), SEEK_SET);
248   
249              if ('' !== $line) {
250                  break;
251              }
252          }
253   
254          return '' === $line ? null : $line;
255      }
256   
257      protected function createProfileFromData($token, $data, $parent = null)
258      {
259          $profile = new Profile($token);
260          $profile->setIp($data['ip']);
261          $profile->setMethod($data['method']);
262          $profile->setUrl($data['url']);
263          $profile->setTime($data['time']);
264          $profile->setCollectors($data['data']);
265   
266          if (!$parent && $data['parent']) {
267              $parent = $this->read($data['parent']);
268          }
269   
270          if ($parent) {
271              $profile->setParent($parent);
272          }
273   
274          foreach ($data['children'] as $token) {
275              if (!$token || !file_exists($file = $this->getFilename($token))) {
276                  continue;
277              }
278   
279              $profile->addChild($this->createProfileFromData($token, unserialize(file_get_contents($file)), $profile));
280          }
281   
282          return $profile;
283      }
284  }
285