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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
BaseMemcacheProfilerStorage.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 @trigger_error('The '.__NAMESPACE__.'\BaseMemcacheProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
015
016 /**
017 * Base Memcache storage for profiling information in a Memcache.
018 *
019 * @author Andrej Hudec <pulzarraider@gmail.com>
020 *
021 * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
022 * Use {@link FileProfilerStorage} instead.
023 */
024 abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
025 {
026 const TOKEN_PREFIX = 'sf_profiler_';
027
028 protected $dsn;
029 protected $lifetime;
030
031 /**
032 * Constructor.
033 *
034 * @param string $dsn A data source name
035 * @param string $username
036 * @param string $password
037 * @param int $lifetime The lifetime to use for the purge
038 */
039 public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
040 {
041 $this->dsn = $dsn;
042 $this->lifetime = (int) $lifetime;
043 }
044
045 /**
046 * {@inheritdoc}
047 */
048 public function find($ip, $url, $limit, $method, $start = null, $end = null)
049 {
050 $indexName = $this->getIndexName();
051
052 $indexContent = $this->getValue($indexName);
053 if (!$indexContent) {
054 return array();
055 }
056
057 $profileList = explode("\n", $indexContent);
058 $result = array();
059
060 foreach ($profileList as $item) {
061 if ($limit === 0) {
062 break;
063 }
064
065 if ($item == '') {
066 continue;
067 }
068
069 $values = explode("\t", $item, 7);
070 list($itemToken, $itemIp, $itemMethod, $itemUrl, $itemTime, $itemParent) = $values;
071 $statusCode = isset($values[6]) ? $values[6] : null;
072
073 $itemTime = (int) $itemTime;
074
075 if ($ip && false === strpos($itemIp, $ip) || $url && false === strpos($itemUrl, $url) || $method && false === strpos($itemMethod, $method)) {
076 continue;
077 }
078
079 if (!empty($start) && $itemTime < $start) {
080 continue;
081 }
082
083 if (!empty($end) && $itemTime > $end) {
084 continue;
085 }
086
087 $result[$itemToken] = array(
088 'token' => $itemToken,
089 'ip' => $itemIp,
090 'method' => $itemMethod,
091 'url' => $itemUrl,
092 'time' => $itemTime,
093 'parent' => $itemParent,
094 'status_code' => $statusCode,
095 );
096 --$limit;
097 }
098
099 usort($result, function ($a, $b) {
100 if ($a['time'] === $b['time']) {
101 return 0;
102 }
103
104 return $a['time'] > $b['time'] ? -1 : 1;
105 });
106
107 return $result;
108 }
109
110 /**
111 * {@inheritdoc}
112 */
113 public function purge()
114 {
115 // delete only items from index
116 $indexName = $this->getIndexName();
117
118 $indexContent = $this->getValue($indexName);
119
120 if (!$indexContent) {
121 return false;
122 }
123
124 $profileList = explode("\n", $indexContent);
125
126 foreach ($profileList as $item) {
127 if ($item == '') {
128 continue;
129 }
130
131 if (false !== $pos = strpos($item, "\t")) {
132 $this->delete($this->getItemName(substr($item, 0, $pos)));
133 }
134 }
135
136 return $this->delete($indexName);
137 }
138
139 /**
140 * {@inheritdoc}
141 */
142 public function read($token)
143 {
144 if (empty($token)) {
145 return false;
146 }
147
148 $profile = $this->getValue($this->getItemName($token));
149
150 if (false !== $profile) {
151 $profile = $this->createProfileFromData($token, $profile);
152 }
153
154 return $profile;
155 }
156
157 /**
158 * {@inheritdoc}
159 */
160 public function write(Profile $profile)
161 {
162 $data = array(
163 'token' => $profile->getToken(),
164 'parent' => $profile->getParentToken(),
165 'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
166 'data' => $profile->getCollectors(),
167 'ip' => $profile->getIp(),
168 'method' => $profile->getMethod(),
169 'url' => $profile->getUrl(),
170 'time' => $profile->getTime(),
171 );
172
173 $profileIndexed = false !== $this->getValue($this->getItemName($profile->getToken()));
174
175 if ($this->setValue($this->getItemName($profile->getToken()), $data, $this->lifetime)) {
176 if (!$profileIndexed) {
177 // Add to index
178 $indexName = $this->getIndexName();
179
180 $indexRow = implode("\t", array(
181 $profile->getToken(),
182 $profile->getIp(),
183 $profile->getMethod(),
184 $profile->getUrl(),
185 $profile->getTime(),
186 $profile->getParentToken(),
187 $profile->getStatusCode(),
188 ))."\n";
189
190 return $this->appendValue($indexName, $indexRow, $this->lifetime);
191 }
192
193 return true;
194 }
195
196 return false;
197 }
198
199 /**
200 * Retrieve item from the memcache server.
201 *
202 * @param string $key
203 *
204 * @return mixed
205 */
206 abstract protected function getValue($key);
207
208 /**
209 * Store an item on the memcache server under the specified key.
210 *
211 * @param string $key
212 * @param mixed $value
213 * @param int $expiration
214 *
215 * @return bool
216 */
217 abstract protected function setValue($key, $value, $expiration = 0);
218
219 /**
220 * Delete item from the memcache server.
221 *
222 * @param string $key
223 *
224 * @return bool
225 */
226 abstract protected function delete($key);
227
228 /**
229 * Append data to an existing item on the memcache server.
230 *
231 * @param string $key
232 * @param string $value
233 * @param int $expiration
234 *
235 * @return bool
236 */
237 abstract protected function appendValue($key, $value, $expiration = 0);
238
239 private function createProfileFromData($token, $data, $parent = null)
240 {
241 $profile = new Profile($token);
242 $profile->setIp($data['ip']);
243 $profile->setMethod($data['method']);
244 $profile->setUrl($data['url']);
245 $profile->setTime($data['time']);
246 $profile->setCollectors($data['data']);
247
248 if (!$parent && $data['parent']) {
249 $parent = $this->read($data['parent']);
250 }
251
252 if ($parent) {
253 $profile->setParent($parent);
254 }
255
256 foreach ($data['children'] as $token) {
257 if (!$token) {
258 continue;
259 }
260
261 if (!$childProfileData = $this->getValue($this->getItemName($token))) {
262 continue;
263 }
264
265 $profile->addChild($this->createProfileFromData($token, $childProfileData, $profile));
266 }
267
268 return $profile;
269 }
270
271 /**
272 * Get item name.
273 *
274 * @param string $token
275 *
276 * @return string
277 */
278 private function getItemName($token)
279 {
280 $name = self::TOKEN_PREFIX.$token;
281
282 if ($this->isItemNameValid($name)) {
283 return $name;
284 }
285
286 return false;
287 }
288
289 /**
290 * Get name of index.
291 *
292 * @return string
293 */
294 private function getIndexName()
295 {
296 $name = self::TOKEN_PREFIX.'index';
297
298 if ($this->isItemNameValid($name)) {
299 return $name;
300 }
301
302 return false;
303 }
304
305 private function isItemNameValid($name)
306 {
307 $length = strlen($name);
308
309 if ($length > 250) {
310 throw new \RuntimeException(sprintf('The memcache item key "%s" is too long (%s bytes). Allowed maximum size is 250 bytes.', $name, $length));
311 }
312
313 return true;
314 }
315 }
316