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