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