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

MongoDbProfilerStorage.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 7.32 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__.'\MongoDbProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
015   
016  /**
017   * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
018   *             Use {@link FileProfilerStorage} instead.
019   */
020  class MongoDbProfilerStorage implements ProfilerStorageInterface
021  {
022      protected $dsn;
023      protected $lifetime;
024      private $mongo;
025   
026      /**
027       * Constructor.
028       *
029       * @param string $dsn      A data source name
030       * @param string $username Not used
031       * @param string $password Not used
032       * @param int    $lifetime The lifetime to use for the purge
033       */
034      public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
035      {
036          $this->dsn = $dsn;
037          $this->lifetime = (int) $lifetime;
038      }
039   
040      /**
041       * {@inheritdoc}
042       */
043      public function find($ip, $url, $limit, $method, $start = null, $end = null)
044      {
045          $cursor = $this->getMongo()->find($this->buildQuery($ip, $url, $method, $start, $end), array('_id', 'parent', 'ip', 'method', 'url', 'time', 'status_code'))->sort(array('time' => -1))->limit($limit);
046   
047          $tokens = array();
048          foreach ($cursor as $profile) {
049              $tokens[] = $this->getData($profile);
050          }
051   
052          return $tokens;
053      }
054   
055      /**
056       * {@inheritdoc}
057       */
058      public function purge()
059      {
060          $this->getMongo()->remove(array());
061      }
062   
063      /**
064       * {@inheritdoc}
065       */
066      public function read($token)
067      {
068          $profile = $this->getMongo()->findOne(array('_id' => $token, 'data' => array('$exists' => true)));
069   
070          if (null !== $profile) {
071              $profile = $this->createProfileFromData($this->getData($profile));
072          }
073   
074          return $profile;
075      }
076   
077      /**
078       * {@inheritdoc}
079       */
080      public function write(Profile $profile)
081      {
082          $this->cleanup();
083   
084          $record = array(
085              '_id' => $profile->getToken(),
086              'parent' => $profile->getParentToken(),
087              'data' => base64_encode(serialize($profile->getCollectors())),
088              'ip' => $profile->getIp(),
089              'method' => $profile->getMethod(),
090              'url' => $profile->getUrl(),
091              'time' => $profile->getTime(),
092              'status_code' => $profile->getStatusCode(),
093          );
094   
095          $result = $this->getMongo()->update(array('_id' => $profile->getToken()), array_filter($record, function ($v) { return !empty($v); }), array('upsert' => true));
096   
097          return (bool) (isset($result['ok']) ? $result['ok'] : $result);
098      }
099   
100      /**
101       * Internal convenience method that returns the instance of the MongoDB Collection.
102       *
103       * @return \MongoCollection
104       *
105       * @throws \RuntimeException
106       */
107      protected function getMongo()
108      {
109          if (null !== $this->mongo) {
110              return $this->mongo;
111          }
112   
113          if (!$parsedDsn = $this->parseDsn($this->dsn)) {
114              throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use MongoDB with an invalid dsn "%s". The expected format is "mongodb://[user:pass@]host/database/collection"', $this->dsn));
115          }
116   
117          list($server, $database, $collection) = $parsedDsn;
118          $mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? '\Mongo' : '\MongoClient';
119          $mongo = new $mongoClass($server);
120   
121          return $this->mongo = $mongo->selectCollection($database, $collection);
122      }
123   
124      /**
125       * @param array $data
126       *
127       * @return Profile
128       */
129      protected function createProfileFromData(array $data)
130      {
131          $profile = $this->getProfile($data);
132   
133          if ($data['parent']) {
134              $parent = $this->getMongo()->findOne(array('_id' => $data['parent'], 'data' => array('$exists' => true)));
135              if ($parent) {
136                  $profile->setParent($this->getProfile($this->getData($parent)));
137              }
138          }
139   
140          $profile->setChildren($this->readChildren($data['token']));
141   
142          return $profile;
143      }
144   
145      /**
146       * @param string $token
147       *
148       * @return Profile[] An array of Profile instances
149       */
150      protected function readChildren($token)
151      {
152          $profiles = array();
153   
154          $cursor = $this->getMongo()->find(array('parent' => $token, 'data' => array('$exists' => true)));
155          foreach ($cursor as $d) {
156              $profiles[] = $this->getProfile($this->getData($d));
157          }
158   
159          return $profiles;
160      }
161   
162      protected function cleanup()
163      {
164          $this->getMongo()->remove(array('time' => array('$lt' => time() - $this->lifetime)));
165      }
166   
167      /**
168       * @param string $ip
169       * @param string $url
170       * @param string $method
171       * @param int    $start
172       * @param int    $end
173       *
174       * @return array
175       */
176      private function buildQuery($ip, $url, $method, $start, $end)
177      {
178          $query = array();
179   
180          if (!empty($ip)) {
181              $query['ip'] = $ip;
182          }
183   
184          if (!empty($url)) {
185              $query['url'] = $url;
186          }
187   
188          if (!empty($method)) {
189              $query['method'] = $method;
190          }
191   
192          if (!empty($start) || !empty($end)) {
193              $query['time'] = array();
194          }
195   
196          if (!empty($start)) {
197              $query['time']['$gte'] = $start;
198          }
199   
200          if (!empty($end)) {
201              $query['time']['$lte'] = $end;
202          }
203   
204          return $query;
205      }
206   
207      /**
208       * @param array $data
209       *
210       * @return array
211       */
212      private function getData(array $data)
213      {
214          return array(
215              'token' => $data['_id'],
216              'parent' => isset($data['parent']) ? $data['parent'] : null,
217              'ip' => isset($data['ip']) ? $data['ip'] : null,
218              'method' => isset($data['method']) ? $data['method'] : null,
219              'url' => isset($data['url']) ? $data['url'] : null,
220              'time' => isset($data['time']) ? $data['time'] : null,
221              'data' => isset($data['data']) ? $data['data'] : null,
222              'status_code' => isset($data['status_code']) ? $data['status_code'] : null,
223          );
224      }
225   
226      /**
227       * @param array $data
228       *
229       * @return Profile
230       */
231      private function getProfile(array $data)
232      {
233          $profile = new Profile($data['token']);
234          $profile->setIp($data['ip']);
235          $profile->setMethod($data['method']);
236          $profile->setUrl($data['url']);
237          $profile->setTime($data['time']);
238          $profile->setCollectors(unserialize(base64_decode($data['data'])));
239   
240          return $profile;
241      }
242   
243      /**
244       * @param string $dsn
245       *
246       * @return null|array Array($server, $database, $collection)
247       */
248      private function parseDsn($dsn)
249      {
250          if (!preg_match('#^(mongodb://.*)/(.*)/(.*)$#', $dsn, $matches)) {
251              return;
252          }
253   
254          $server = $matches[1];
255          $database = $matches[2];
256          $collection = $matches[3];
257          preg_match('#^mongodb://(([^:]+):?(.*)(?=@))?@?([^/]*)(.*)$#', $server, $matchesServer);
258   
259          if ('' == $matchesServer[5] && '' != $matches[2]) {
260              $server .= '/'.$matches[2];
261          }
262   
263          return array($server, $database, $collection);
264      }
265  }
266