SysLoad
/
sysload.php
405 строк · 15.5 Кб
1<?php
2/**
3* Plugin Name: SysLoad
4* Description: Плагин для отображения нагрузки процессора, использования памяти и времени работы сервера.
5* Version: 1.20
6* Author: Aleksey Krivoshein
7*/
8
9// Отображение статистики сервера
10function display_server_stats() {
11ob_start();
12?>
13<div id="server-stats" class="server-stats">
14<div class="charts-container">
15<div class="chart">
16<h3>Нагрузка процессора:</h3>
17<canvas id="cpu-load-chart" width="400" height="200"></canvas>
18</div>
19<div class="chart">
20<h3>Использование памяти:</h3>
21<canvas id="memory-usage-chart" width="400" height="200"></canvas>
22</div>
23</div>
24
25<h3>Статистика сервера:</h3>
26<table>
27<tr>
28<th>Параметр</th>
29<th>Значение</th>
30</tr>
31<tr>
32<td>Время работы сервера:</td>
33<td id="uptime-stats">Загрузка...</td>
34</tr>
35<tr>
36<td>Общая память:</td>
37<td id="total-memory-stats">Загрузка...</td>
38</tr>
39<tr>
40<td>Использованная память:</td>
41<td id="used-memory-stats">Загрузка...</td>
42</tr>
43<tr>
44<td>Нагрузка процессора:</td>
45<td id="cpu-load-stats">Загрузка...</td>
46</tr>
47</table>
48</div>
49<style>
50.charts-container {
51display: flex;
52flex-wrap: wrap;
53justify-content: space-between;
54}
55.chart {
56flex: 1;
57min-width: 300px;
58margin: 10px;
59}
60table {
61width: 100%;
62border-collapse: collapse;
63margin-top: 20px;
64}
65th, td {
66border: 1px solid #ddd;
67padding: 8px;
68text-align: left;
69}
70th {
71background-color: #f2f2f2;
72}
73@media (max-width: 768px) {
74.charts-container {
75flex-direction: column;
76}
77table {
78display: flex;
79flex-direction: column;
80border: none;
81}
82tr {
83display: flex;
84justify-content: space-between;
85border-bottom: 1px solid #ddd;
86padding: 8px 0;
87}
88th, td {
89flex: 1;
90text-align: left;
91}
92}
93</style>
94<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
95<script>
96jQuery(document).ready(function($) {
97let cpuData = [];
98let memoryUsedData = [];
99let totalMemory = 0;
100const cpuChartCtx = document.getElementById('cpu-load-chart').getContext('2d');
101const memoryChartCtx = document.getElementById('memory-usage-chart').getContext('2d');
102
103const cpuChart = new Chart(cpuChartCtx, {
104type: 'line',
105data: {
106labels: [],
107datasets: [{
108label: 'Загрузка процессора (%)',
109data: cpuData,
110borderColor: 'rgba(75, 192, 192, 1)',
111fill: false,
112}]
113},
114options: {
115scales: {
116y: {
117beginAtZero: true,
118max: 100,
119title: {
120display: true,
121text: 'Процент'
122}
123},
124x: {
125title: {
126display: true,
127text: 'Время'
128}
129}
130}
131}
132});
133
134const memoryChart = new Chart(memoryChartCtx, {
135type: 'line',
136data: {
137labels: [],
138datasets: [{
139label: 'Использование памяти (MB)',
140data: memoryUsedData,
141borderColor: 'rgba(153, 102, 255, 1)',
142fill: false,
143}]
144},
145options: {
146scales: {
147y: {
148beginAtZero: true,
149title: {
150display: true,
151text: 'MB'
152},
153max: totalMemory, // Устанавливаем максимальное значение для графика памяти
154},
155x: {
156title: {
157display: true,
158text: 'Время'
159}
160}
161}
162}
163});
164
165function fetchServerStats() {
166$.ajax({
167url: '<?php echo admin_url('admin-ajax.php'); ?>',
168method: 'POST',
169data: {
170action: 'sysload_get_stats',
171},
172success: function(response) {
173if (response.success) {
174totalMemory = response.data.memory.total; // Обновляем общее количество памяти
175memoryChart.options.scales.y.max = totalMemory; // Устанавливаем максимальное значение
176
177cpuData.push(response.data.cpu_load);
178memoryUsedData.push(response.data.memory.used);
179
180const timestamp = new Date().toLocaleTimeString();
181cpuChart.data.labels.push(timestamp);
182memoryChart.data.labels.push(timestamp);
183
184if (cpuData.length > 10) {
185cpuData.shift();
186memoryUsedData.shift();
187cpuChart.data.labels.shift();
188memoryChart.data.labels.shift();
189}
190
191cpuChart.update();
192memoryChart.update();
193
194$('#uptime-stats').html(response.data.uptime);
195$('#total-memory-stats').html(response.data.memory.total + ' MB');
196$('#used-memory-stats').html(response.data.memory.used + ' MB (' + response.data.memory.used_percent + '%)');
197$('#cpu-load-stats').html(response.data.cpu_load + '%');
198} else {
199$('#uptime-stats').html('Ошибка при получении данных: ' + response.data.message);
200}
201},
202error: function() {
203$('#uptime-stats').html('Ошибка при получении данных.');
204}
205});
206}
207
208fetchServerStats();
209setInterval(fetchServerStats, 10000);
210});
211</script>
212<?php
213return ob_get_clean();
214}
215add_shortcode('server_stats', 'display_server_stats');
216
217// AJAX обработчик
218function sysload_get_stats() {
219$cpu_load = sys_getloadavg();
220if (!$cpu_load) {
221wp_send_json_error(['message' => 'Не удалось получить нагрузку процессора.']);
222return;
223}
224
225$cpu_percent = round($cpu_load[0] / (count($cpu_load) * 1.0) * 100, 2);
226$memory = shell_exec('free -m');
227if (!$memory) {
228wp_send_json_error(['message' => 'Не удалось получить данные о памяти.']);
229return;
230}
231
232$memory = explode("\n", $memory);
233$memory_info = preg_split('/\s+/', $memory[1]);
234$uptime = shell_exec('uptime -p');
235if (!$uptime) {
236wp_send_json_error(['message' => 'Не удалось получить время работы.']);
237return;
238}
239
240$response = array(
241'cpu_load' => $cpu_percent,
242'memory' => array(
243'total' => (int)$memory_info[1],
244'used' => (int)$memory_info[2],
245'used_percent' => round(($memory_info[2] / $memory_info[1]) * 100, 2),
246),
247'uptime' => trim($uptime),
248);
249
250wp_send_json_success($response);
251}
252add_action('wp_ajax_sysload_get_stats', 'sysload_get_stats');
253add_action('wp_ajax_nopriv_sysload_get_stats', 'sysload_get_stats');
254
255// Добавляем виджет на главную страницу админки
256function sysload_add_dashboard_widget() {
257wp_add_dashboard_widget(
258'sysload_dashboard_widget',
259'Статистика сервера',
260'sysload_dashboard_widget_display'
261);
262}
263add_action('wp_dashboard_setup', 'sysload_add_dashboard_widget');
264
265// Функция для отображения содержимого виджета
266function sysload_dashboard_widget_display() {
267?>
268<div id="sysload-dashboard-stats">
269<h3>Статистика сервера</h3>
270<p>Загрузка процессора: <span id="dashboard-cpu-load">Загрузка...</span></p>
271<p>Использованная память: <span id="dashboard-used-memory">Загрузка...</span></p>
272<p>Общая память: <span id="dashboard-total-memory">Загрузка...</span></p>
273<p>Время работы сервера: <span id="dashboard-uptime">Загрузка...</span></p>
274
275<div>
276<canvas id="dashboard-cpu-load-chart" width="400" height="200"></canvas>
277<canvas id="dashboard-memory-usage-chart" width="400" height="200"></canvas>
278</div>
279</div>
280
281<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
282<script>
283jQuery(document).ready(function($) {
284let cpuData = [];
285let memoryUsedData = [];
286let totalMemory = 0;
287const cpuChartCtx = document.getElementById('dashboard-cpu-load-chart').getContext('2d');
288const memoryChartCtx = document.getElementById('dashboard-memory-usage-chart').getContext('2d');
289
290const cpuChart = new Chart(cpuChartCtx, {
291type: 'line',
292data: {
293labels: [],
294datasets: [{
295label: 'Загрузка процессора (%)',
296data: cpuData,
297borderColor: 'rgba(75, 192, 192, 1)',
298fill: false,
299}]
300},
301options: {
302scales: {
303y: {
304beginAtZero: true,
305max: 100,
306title: {
307display: true,
308text: 'Процент'
309}
310},
311x: {
312title: {
313display: true,
314text: 'Время'
315}
316}
317}
318}
319});
320
321const memoryChart = new Chart(memoryChartCtx, {
322type: 'line',
323data: {
324labels: [],
325datasets: [{
326label: 'Использование памяти (MB)',
327data: memoryUsedData,
328borderColor: 'rgba(153, 102, 255, 1)',
329fill: false,
330}]
331},
332options: {
333scales: {
334y: {
335beginAtZero: true,
336title: {
337display: true,
338text: 'MB'
339},
340max: totalMemory, // Устанавливаем максимальное значение для графика памяти
341},
342x: {
343title: {
344display: true,
345text: 'Время'
346}
347}
348}
349}
350});
351
352function fetchDashboardStats() {
353$.ajax({
354url: '<?php echo admin_url('admin-ajax.php'); ?>',
355method: 'POST',
356data: {
357action: 'sysload_get_stats',
358},
359success: function(response) {
360if (response.success) {
361totalMemory = response.data.memory.total; // Обновляем общее количество памяти
362memoryChart.options.scales.y.max = totalMemory; // Устанавливаем максимальное значение
363
364cpuData.push(response.data.cpu_load);
365memoryUsedData.push(response.data.memory.used);
366
367const timestamp = new Date().toLocaleTimeString();
368cpuChart.data.labels.push(timestamp);
369memoryChart.data.labels.push(timestamp);
370
371if (cpuData.length > 10) {
372cpuData.shift();
373memoryUsedData.shift();
374cpuChart.data.labels.shift();
375memoryChart.data.labels.shift();
376}
377
378cpuChart.update();
379memoryChart.update();
380
381$('#dashboard-uptime').html(response.data.uptime);
382$('#dashboard-total-memory').html(response.data.memory.total + ' MB');
383$('#dashboard-used-memory').html(response.data.memory.used + ' MB (' + response.data.memory.used_percent + '%)');
384$('#dashboard-cpu-load').html(response.data.cpu_load + '%');
385} else {
386$('#dashboard-uptime').html('Ошибка при получении данных: ' + response.data.message);
387}
388},
389error: function() {
390$('#dashboard-uptime').html('Ошибка при получении данных.');
391}
392});
393}
394
395fetchDashboardStats();
396setInterval(fetchDashboardStats, 10000);
397});
398</script>
399<?php
400}
401
402// Добавьте следующий код, чтобы создать новый виджет на главной странице админки
403add_action('wp_dashboard_setup', 'sysload_add_dashboard_widget');
404
405?>
406