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

PdoProfilerStorage.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 7.98 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  @trigger_error('The '.__NAMESPACE__.'\PdoProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
015   
016  /**
017   * Base PDO storage for profiling information in a PDO database.
018   *
019   * @author Fabien Potencier <fabien@symfony.com>
020   * @author Jan Schumann <js@schumann-it.com>
021   *
022   * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
023   *             Use {@link FileProfilerStorage} instead.
024   */
025  abstract class PdoProfilerStorage implements ProfilerStorageInterface
026  {
027      protected $dsn;
028      protected $username;
029      protected $password;
030      protected $lifetime;
031      protected $db;
032   
033      /**
034       * Constructor.
035       *
036       * @param string $dsn      A data source name
037       * @param string $username The username for the database
038       * @param string $password The password for the database
039       * @param int    $lifetime The lifetime to use for the purge
040       */
041      public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
042      {
043          $this->dsn = $dsn;
044          $this->username = $username;
045          $this->password = $password;
046          $this->lifetime = (int) $lifetime;
047      }
048   
049      /**
050       * {@inheritdoc}
051       */
052      public function find($ip, $url, $limit, $method, $start = null, $end = null)
053      {
054          if (null === $start) {
055              $start = 0;
056          }
057   
058          if (null === $end) {
059              $end = time();
060          }
061   
062          list($criteria, $args) = $this->buildCriteria($ip, $url, $start, $end, $limit, $method);
063   
064          $criteria = $criteria ? 'WHERE '.implode(' AND ', $criteria) : '';
065   
066          $db = $this->initDb();
067          $tokens = $this->fetch($db, 'SELECT token, ip, method, url, time, parent, status_code FROM sf_profiler_data '.$criteria.' ORDER BY time DESC LIMIT '.((int) $limit), $args);
068          $this->close($db);
069   
070          return $tokens;
071      }
072   
073      /**
074       * {@inheritdoc}
075       */
076      public function read($token)
077      {
078          $db = $this->initDb();
079          $args = array(':token' => $token);
080          $data = $this->fetch($db, 'SELECT data, parent, ip, method, url, time FROM sf_profiler_data WHERE token = :token LIMIT 1', $args);
081          $this->close($db);
082          if (isset($data[0]['data'])) {
083              return $this->createProfileFromData($token, $data[0]);
084          }
085      }
086   
087      /**
088       * {@inheritdoc}
089       */
090      public function write(Profile $profile)
091      {
092          $db = $this->initDb();
093          $args = array(
094              ':token' => $profile->getToken(),
095              ':parent' => $profile->getParentToken(),
096              ':data' => base64_encode(serialize($profile->getCollectors())),
097              ':ip' => $profile->getIp(),
098              ':method' => $profile->getMethod(),
099              ':url' => $profile->getUrl(),
100              ':time' => $profile->getTime(),
101              ':created_at' => time(),
102              ':status_code' => $profile->getStatusCode(),
103          );
104   
105          try {
106              if ($this->has($profile->getToken())) {
107                  $this->exec($db, 'UPDATE sf_profiler_data SET parent = :parent, data = :data, ip = :ip, method = :method, url = :url, time = :time, created_at = :created_at, status_code = :status_code WHERE token = :token', $args);
108              } else {
109                  $this->exec($db, 'INSERT INTO sf_profiler_data (token, parent, data, ip, method, url, time, created_at, status_code) VALUES (:token, :parent, :data, :ip, :method, :url, :time, :created_at, :status_code)', $args);
110              }
111              $this->cleanup();
112              $status = true;
113          } catch (\Exception $e) {
114              $status = false;
115          }
116   
117          $this->close($db);
118   
119          return $status;
120      }
121   
122      /**
123       * {@inheritdoc}
124       */
125      public function purge()
126      {
127          $db = $this->initDb();
128          $this->exec($db, 'DELETE FROM sf_profiler_data');
129          $this->close($db);
130      }
131   
132      /**
133       * Build SQL criteria to fetch records by ip and url.
134       *
135       * @param string $ip     The IP
136       * @param string $url    The URL
137       * @param string $start  The start period to search from
138       * @param string $end    The end period to search to
139       * @param string $limit  The maximum number of tokens to return
140       * @param string $method The request method
141       *
142       * @return array An array with (criteria, args)
143       */
144      abstract protected function buildCriteria($ip, $url, $start, $end, $limit, $method);
145   
146      /**
147       * Initializes the database.
148       *
149       * @throws \RuntimeException When the requested database driver is not installed
150       */
151      abstract protected function initDb();
152   
153      protected function cleanup()
154      {
155          $db = $this->initDb();
156          $this->exec($db, 'DELETE FROM sf_profiler_data WHERE created_at < :time', array(':time' => time() - $this->lifetime));
157          $this->close($db);
158      }
159   
160      protected function exec($db, $query, array $args = array())
161      {
162          $stmt = $this->prepareStatement($db, $query);
163   
164          foreach ($args as $arg => $val) {
165              $stmt->bindValue($arg, $val, is_int($val) ? \PDO::PARAM_INT : \PDO::PARAM_STR);
166          }
167          $success = $stmt->execute();
168          if (!$success) {
169              throw new \RuntimeException(sprintf('Error executing query "%s"', $query));
170          }
171      }
172   
173      protected function prepareStatement($db, $query)
174      {
175          try {
176              $stmt = $db->prepare($query);
177          } catch (\Exception $e) {
178              $stmt = false;
179          }
180   
181          if (false === $stmt) {
182              throw new \RuntimeException('The database cannot successfully prepare the statement');
183          }
184   
185          return $stmt;
186      }
187   
188      protected function fetch($db, $query, array $args = array())
189      {
190          $stmt = $this->prepareStatement($db, $query);
191   
192          foreach ($args as $arg => $val) {
193              $stmt->bindValue($arg, $val, is_int($val) ? \PDO::PARAM_INT : \PDO::PARAM_STR);
194          }
195          $stmt->execute();
196   
197          return $stmt->fetchAll(\PDO::FETCH_ASSOC);
198      }
199   
200      protected function close($db)
201      {
202      }
203   
204      protected function createProfileFromData($token, $data, $parent = null)
205      {
206          $profile = new Profile($token);
207          $profile->setIp($data['ip']);
208          $profile->setMethod($data['method']);
209          $profile->setUrl($data['url']);
210          $profile->setTime($data['time']);
211          $profile->setCollectors(unserialize(base64_decode($data['data'])));
212   
213          if (!$parent && !empty($data['parent'])) {
214              $parent = $this->read($data['parent']);
215          }
216   
217          if ($parent) {
218              $profile->setParent($parent);
219          }
220   
221          $profile->setChildren($this->readChildren($token, $profile));
222   
223          return $profile;
224      }
225   
226      /**
227       * Reads the child profiles for the given token.
228       *
229       * @param string $token  The parent token
230       * @param string $parent The parent instance
231       *
232       * @return Profile[] An array of Profile instance
233       */
234      protected function readChildren($token, $parent)
235      {
236          $db = $this->initDb();
237          $data = $this->fetch($db, 'SELECT token, data, ip, method, url, time FROM sf_profiler_data WHERE parent = :token', array(':token' => $token));
238          $this->close($db);
239   
240          if (!$data) {
241              return array();
242          }
243   
244          $profiles = array();
245          foreach ($data as $d) {
246              $profiles[] = $this->createProfileFromData($d['token'], $d, $parent);
247          }
248   
249          return $profiles;
250      }
251   
252      /**
253       * Returns whether data for the given token already exists in storage.
254       *
255       * @param string $token The profile token
256       *
257       * @return string
258       */
259      protected function has($token)
260      {
261          $db = $this->initDb();
262          $tokenExists = $this->fetch($db, 'SELECT 1 FROM sf_profiler_data WHERE token = :token LIMIT 1', array(':token' => $token));
263          $this->close($db);
264   
265          return !empty($tokenExists);
266      }
267  }
268