|
1 | 1 | <?php |
2 | | -/** |
3 | | - * The InnoDB storage engine |
4 | | - */ |
5 | 2 |
|
6 | 3 | declare(strict_types=1); |
7 | 4 |
|
8 | 5 | namespace PhpMyAdmin\Engines; |
9 | 6 |
|
10 | 7 | use PhpMyAdmin\Dbal\DatabaseInterface; |
| 8 | +use PhpMyAdmin\Engines\Innodb\BufferPool; |
11 | 9 | use PhpMyAdmin\StorageEngine; |
12 | | -use PhpMyAdmin\Util; |
| 10 | +use PhpMyAdmin\Template; |
13 | 11 |
|
14 | 12 | use function __; |
15 | 13 | use function htmlspecialchars; |
16 | | -use function implode; |
17 | 14 |
|
18 | 15 | /** |
19 | 16 | * The InnoDB storage engine |
@@ -110,141 +107,11 @@ public function getInfoPages(): array |
110 | 107 | * |
111 | 108 | * @return string html table with stats |
112 | 109 | */ |
113 | | - public function getPageBufferpool(): string |
| 110 | + public function getPageBufferPool(): string |
114 | 111 | { |
115 | | - // The following query is only possible because we know |
116 | | - // that we are on MySQL 5 here (checked above)! |
117 | | - // side note: I love MySQL 5 for this. :-) |
118 | | - $sql = 'SHOW STATUS' |
119 | | - . ' WHERE Variable_name LIKE \'Innodb\\_buffer\\_pool\\_%\'' |
120 | | - . ' OR Variable_name = \'Innodb_page_size\';'; |
121 | | - $status = DatabaseInterface::getInstance()->fetchResult($sql, 0, 1); |
122 | | - |
123 | | - /** @var string[] $bytes */ |
124 | | - $bytes = Util::formatByteDown($status['Innodb_buffer_pool_pages_total'] * $status['Innodb_page_size']); |
125 | | - |
126 | | - $output = '<table class="table table-striped table-hover w-auto float-start caption-top">' . "\n" |
127 | | - . ' <caption>' . "\n" |
128 | | - . ' ' . __('Buffer Pool Usage') . "\n" |
129 | | - . ' </caption>' . "\n" |
130 | | - . ' <tfoot>' . "\n" |
131 | | - . ' <tr>' . "\n" |
132 | | - . ' <th colspan="2">' . "\n" |
133 | | - . ' ' . __('Total:') . ' ' |
134 | | - . Util::formatNumber($status['Innodb_buffer_pool_pages_total'], 0) |
135 | | - . ' ' . __('pages') |
136 | | - . ' / ' |
137 | | - . implode(' ', $bytes) . "\n" |
138 | | - . ' </th>' . "\n" |
139 | | - . ' </tr>' . "\n" |
140 | | - . ' </tfoot>' . "\n" |
141 | | - . ' <tbody>' . "\n" |
142 | | - . ' <tr>' . "\n" |
143 | | - . ' <th scope="row">' . __('Free pages') . '</th>' . "\n" |
144 | | - . ' <td class="font-monospace text-end">' |
145 | | - . Util::formatNumber($status['Innodb_buffer_pool_pages_free'], 0) |
146 | | - . '</td>' . "\n" |
147 | | - . ' </tr>' . "\n" |
148 | | - . ' <tr>' . "\n" |
149 | | - . ' <th scope="row">' . __('Dirty pages') . '</th>' . "\n" |
150 | | - . ' <td class="font-monospace text-end">' |
151 | | - . Util::formatNumber($status['Innodb_buffer_pool_pages_dirty'], 0) |
152 | | - . '</td>' . "\n" |
153 | | - . ' </tr>' . "\n" |
154 | | - . ' <tr>' . "\n" |
155 | | - . ' <th scope="row">' . __('Pages containing data') . '</th>' . "\n" |
156 | | - . ' <td class="font-monospace text-end">' |
157 | | - . Util::formatNumber($status['Innodb_buffer_pool_pages_data'], 0) . "\n" |
158 | | - . '</td>' . "\n" |
159 | | - . ' </tr>' . "\n" |
160 | | - . ' <tr>' . "\n" |
161 | | - . ' <th scope="row">' . __('Pages to be flushed') . '</th>' . "\n" |
162 | | - . ' <td class="font-monospace text-end">' |
163 | | - . Util::formatNumber($status['Innodb_buffer_pool_pages_flushed'], 0) . "\n" |
164 | | - . '</td>' . "\n" |
165 | | - . ' </tr>' . "\n" |
166 | | - . ' <tr>' . "\n" |
167 | | - . ' <th scope="row">' . __('Busy pages') . '</th>' . "\n" |
168 | | - . ' <td class="font-monospace text-end">' |
169 | | - . Util::formatNumber($status['Innodb_buffer_pool_pages_misc'], 0) . "\n" |
170 | | - . '</td>' . "\n" |
171 | | - . ' </tr>'; |
172 | | - |
173 | | - // not present at least since MySQL 5.1.40 |
174 | | - if (isset($status['Innodb_buffer_pool_pages_latched'])) { |
175 | | - $output .= ' <tr>' |
176 | | - . ' <th scope="row">' . __('Latched pages') . '</th>' |
177 | | - . ' <td class="font-monospace text-end">' |
178 | | - . Util::formatNumber($status['Innodb_buffer_pool_pages_latched'], 0) |
179 | | - . '</td>' |
180 | | - . ' </tr>'; |
181 | | - } |
182 | | - |
183 | | - $output .= ' </tbody>' . "\n" |
184 | | - . '</table>' . "\n\n" |
185 | | - . '<table class="table table-striped table-hover w-auto ms-4 float-start caption-top">' . "\n" |
186 | | - . ' <caption>' . "\n" |
187 | | - . ' ' . __('Buffer Pool Activity') . "\n" |
188 | | - . ' </caption>' . "\n" |
189 | | - . ' <tbody>' . "\n" |
190 | | - . ' <tr>' . "\n" |
191 | | - . ' <th scope="row">' . __('Read requests') . '</th>' . "\n" |
192 | | - . ' <td class="font-monospace text-end">' |
193 | | - . Util::formatNumber($status['Innodb_buffer_pool_read_requests'], 0) . "\n" |
194 | | - . '</td>' . "\n" |
195 | | - . ' </tr>' . "\n" |
196 | | - . ' <tr>' . "\n" |
197 | | - . ' <th scope="row">' . __('Write requests') . '</th>' . "\n" |
198 | | - . ' <td class="font-monospace text-end">' |
199 | | - . Util::formatNumber($status['Innodb_buffer_pool_write_requests'], 0) . "\n" |
200 | | - . '</td>' . "\n" |
201 | | - . ' </tr>' . "\n" |
202 | | - . ' <tr>' . "\n" |
203 | | - . ' <th scope="row">' . __('Read misses') . '</th>' . "\n" |
204 | | - . ' <td class="font-monospace text-end">' |
205 | | - . Util::formatNumber($status['Innodb_buffer_pool_reads'], 0) . "\n" |
206 | | - . '</td>' . "\n" |
207 | | - . ' </tr>' . "\n" |
208 | | - . ' <tr>' . "\n" |
209 | | - . ' <th scope="row">' . __('Write waits') . '</th>' . "\n" |
210 | | - . ' <td class="font-monospace text-end">' |
211 | | - . Util::formatNumber($status['Innodb_buffer_pool_wait_free'], 0) . "\n" |
212 | | - . '</td>' . "\n" |
213 | | - . ' </tr>' . "\n" |
214 | | - . ' <tr>' . "\n" |
215 | | - . ' <th scope="row">' . __('Read misses in %') . '</th>' . "\n" |
216 | | - . ' <td class="font-monospace text-end">' |
217 | | - . ($status['Innodb_buffer_pool_read_requests'] == 0 |
218 | | - ? '---' |
219 | | - : htmlspecialchars( |
220 | | - Util::formatNumber( |
221 | | - $status['Innodb_buffer_pool_reads'] * 100 |
222 | | - / $status['Innodb_buffer_pool_read_requests'], |
223 | | - 3, |
224 | | - 2, |
225 | | - ), |
226 | | - ) . ' %') . "\n" |
227 | | - . '</td>' . "\n" |
228 | | - . ' </tr>' . "\n" |
229 | | - . ' <tr>' . "\n" |
230 | | - . ' <th scope="row">' . __('Write waits in %') . '</th>' . "\n" |
231 | | - . ' <td class="font-monospace text-end">' |
232 | | - . ($status['Innodb_buffer_pool_write_requests'] == 0 |
233 | | - ? '---' |
234 | | - : htmlspecialchars( |
235 | | - Util::formatNumber( |
236 | | - $status['Innodb_buffer_pool_wait_free'] * 100 |
237 | | - / $status['Innodb_buffer_pool_write_requests'], |
238 | | - 3, |
239 | | - 2, |
240 | | - ), |
241 | | - ) . ' %') . "\n" |
242 | | - . '</td>' . "\n" |
243 | | - . ' </tr>' . "\n" |
244 | | - . ' </tbody>' . "\n" |
245 | | - . '</table>' . "\n"; |
246 | | - |
247 | | - return $output; |
| 112 | + return (new Template())->render('server/engines/_innodb_buffer_pool', [ |
| 113 | + 'buffer_pool' => $this->getBufferPoolStatus(), |
| 114 | + ]); |
248 | 115 | } |
249 | 116 |
|
250 | 117 | /** |
@@ -313,4 +180,14 @@ public function supportsFilePerTable(): bool |
313 | 180 |
|
314 | 181 | return $dbi->fetchValue("SHOW GLOBAL VARIABLES LIKE 'innodb_file_per_table';", 1) === 'ON'; |
315 | 182 | } |
| 183 | + |
| 184 | + private function getBufferPoolStatus(): BufferPool |
| 185 | + { |
| 186 | + $result = DatabaseInterface::getInstance()->tryQuery( |
| 187 | + "SHOW STATUS WHERE Variable_name LIKE 'Innodb\\_buffer\\_pool\\_%' OR Variable_name = 'Innodb_page_size';", |
| 188 | + cacheAffectedRows: false, |
| 189 | + ); |
| 190 | + |
| 191 | + return BufferPool::fromResult($result !== false ? $result->fetchAllKeyPair() : []); |
| 192 | + } |
316 | 193 | } |
0 commit comments