Annotation of embedaddon/php/sapi/fpm/status.html.in, revision 1.1.1.1
1.1 misho 1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2: <html xmlns="http://www.w3.org/1999/xhtml">
3: <!--
4: $Id$
5: (c) 2011 Jerome Loyet
6: The PHP License, version 3.01
7: This is sample real-time status page for FPM. You can change it to better feet your needs.
8: -->
9: <head>
10: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
11: <style type="text/css">
12: body {background-color: #ffffff; color: #000000;}
13: body, td, th, h1, h2 {font-family: sans-serif;}
14: pre {margin: 0px; font-family: monospace;}
15: a:link {color: #000099; text-decoration: none; background-color: #ffffff;}
16: a:hover {text-decoration: underline;}
17: table {border-collapse: collapse;}
18: .center {text-align: center;}
19: .center table { margin-left: auto; margin-right: auto; text-align: left;}
20: .center th { text-align: center !important; }
21: td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}
22: h1 {font-size: 150%;}
23: h2 {font-size: 125%;}
24: .p {text-align: left;}
25: .e {background-color: #ccccff; font-weight: bold; color: #000000;}
26: .h {background-color: #9999cc; font-weight: bold; color: #000000;}
27:
28: .v {background-color: #cccccc; color: #000000;}
29: .w {background-color: #ccccff; color: #000000;}
30:
31: .h th {
32: cursor: pointer;
33: }
34: img {float: right; border: 0px;}
35: hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000000;}
36: </style>
37: <title>PHP-FPM status page</title>
38: <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /></head>
39: <body>
40: <div class="center">
41: <table border="0" cellpadding="3" width="95%">
42: <tr class="h">
43: <td>
44: <a href="http://www.php.net/"><img border="0" src="https://static.php.net/www.php.net/images/php.gif" alt="PHP Logo" /></a><h1 class="p">PHP-FPM real-time status page</h1>
45: </td>
46: </tr>
47: </table>
48: <br />
49: <table border="0" cellpadding="3" width="95%">
50: <tr><td class="e">Status URL</td><td class="v"><input type="text" id="url" size="45" /></td></tr>
51: <tr><td class="e">Ajax status</td><td class="v" id="status"></td></tr>
52: <tr><td class="e">Refresh Rate</td><td class="v"><input type="text" id="rate" value="1" /></td></tr>
53: <tr>
54: <td class="e">Actions</td>
55: <td class="v">
56: <button onclick="javascript:refresh();">Manual Refresh</button>
57: <button id="play" onclick="javascript:playpause();">Play</button>
58: </td>
59: </tr>
60: </table>
61: <h1>Pool Status</h1>
62: <table border="0" cellpadding="3" width="95%" id="short">
63: <tr style="display: none;"><td> </td></tr>
64: </table>
65: <h1>Active Processes status</h1>
66: <table border="0" cellpadding="3" width="95%" id="active">
67: <tr class="h"><th>PID↓</th><th>Start Time</th><th>Start Since</th><th>Requests Served</th><th>Request Duration</th><th>Request method</th><th>Request URI</th><th>Content Length</th><th>User</th><th>Script</th></tr>
68: </table>
69: <h1>Idle Processes status</h1>
70: <table border="0" cellpadding="3" width="95%" id="idle">
71: <tr class="h"><th>PID↓</th><th>Start Time</th><th>Start Since</th><th>Requests Served</th><th>Request Duration</th><th>Request method</th><th>Request URI</th><th>Content Length</th><th>User</th><th>Script</th><th>Last Request %CPU</th><th>Last Request Memory</th></tr>
72: </table>
73: </div>
74: <p>
75: <a href="http://validator.w3.org/check?uri=referer">
76: <img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" />
77: </a>
78: </p>
79: <script type="text/javascript">
80: <!--
81: var xhr_object = null;
82: var doc_url = document.getElementById("url");
83: var doc_rate = document.getElementById("rate");
84: var doc_status = document.getElementById("status");
85: var doc_play = document.getElementById("play");
86: var doc_short = document.getElementById("short");
87: var doc_active = document.getElementById("active");
88: var doc_idle = document.getElementById("idle");
89: var rate = 0;
90: var play=0;
91: var delay = 1000;
92: var order_active_index = 0;
93: var order_active_reverse = 0;
94: var order_idle_index = 0;
95: var order_idle_reverse = 0;
96: var sort_index;
97: var sort_order;
98:
99: doc_url.value = location.protocol + '//' + location.host + "/status?json&full";
100:
101: ths = document.getElementsByTagName("th");
102: for (var i=0; i<ths.length; i++) {
103: var th = ths[i];
104: if (th.parentNode.className == "h") {
105: th.onclick = function() { order(this); return false; };
106: }
107: }
108:
109: xhr_object = create_ajax();
110:
111: function create_ajax() {
112: if (window.XMLHttpRequest) {
113: return new XMLHttpRequest();
114: }
115: var names = [
116: "Msxml2.XMLHTTP.6.0",
117: "Msxml2.XMLHTTP.3.0",
118: "Msxml2.XMLHTTP",
119: "Microsoft.XMLHTTP"
120: ];
121: for(var i in names)
122: {
123: try {
124: return new ActiveXObject(names[i]);
125: } catch(e){}
126: }
127: alert("Browser not compatible ...");
128: }
129:
130: function order(cell) {
131: var table;
132:
133: if (cell.constructor != HTMLTableCellElement && cell.constructor != HTMLTableHeaderCellElement) {
134: return;
135: }
136:
137: table = cell.parentNode.parentNode.parentNode;
138:
139: if (table == doc_active) {
140: if (order_active_index == cell.cellIndex) {
141: if (order_active_reverse == 0) {
142: cell.innerHTML = cell.innerHTML.replace(/.$/, "↑");
143: order_active_reverse = 1;
144: } else {
145: cell.innerHTML = cell.innerHTML.replace(/.$/, "↓");
146: order_active_reverse = 0;
147: }
148: } else {
149: var c = doc_active.rows[0].cells[order_active_index];
150: c.innerHTML = c.innerHTML.replace(/.$/, "");
151: cell.innerHTML = cell.innerHTML.replace(/$/, order_active_reverse == 0 ? "↓" : "↑");
152: order_active_index = cell.cellIndex;
153: }
154: reorder(table, order_active_index, order_active_reverse);
155: return;
156: }
157:
158: if (table == doc_idle) {
159: if (order_idle_index == cell.cellIndex) {
160: if (order_idle_reverse == 0) {
161: cell.innerHTML = cell.innerHTML.replace(/.$/, "↑");
162: order_idle_reverse = 1;
163: } else {
164: cell.innerHTML = cell.innerHTML.replace(/.$/, "↓");
165: order_idle_reverse = 0;
166: }
167: } else {
168: var c = doc_idle.rows[0].cells[order_idle_index];
169: c.innerHTML = c.innerHTML.replace(/.$/, "");
170: cell.innerHTML = cell.innerHTML.replace(/$/, order_idle_reverse == 0 ? "↓" : "↑");
171: order_idle_index = cell.cellIndex;
172: }
173: reorder(table, order_idle_index, order_idle_reverse);
174: return;
175: }
176: }
177:
178: function reorder(table, index, order) {
179: var rows = [];
180: while (table.rows.length > 1) {
181: rows.push(table.rows[1]);
182: table.deleteRow(1);
183: }
184: sort_index = index;
185: sort_order = order;
186: rows.sort(sort_table);
187: for (var i in rows) {
188: table.appendChild(rows[i]);
189: }
190: var odd = 1;
191: for (var i=1; i<table.rows.length; i++) {
192: table.rows[i].className = odd++ % 2 == 0 ? "v" : "w";
193: }
194: return;
195: }
196:
197: function sort_table(a, b) {
198: if (a.cells[0].tagName == "TH") return -1;
199: if (b.cells[0].tagName == "TH") return 1;
200:
201: if (a.cells[sort_index].__search_t == 0) { /* integer */
202: if (!sort_order) return a.cells[sort_index].__search_v - b.cells[sort_index].__search_v;
203: return b.cells[sort_index].__search_v - a.cells[sort_index].__search_v;;
204: }
205:
206: /* string */
207: if (!sort_order) return a.cells[sort_index].__search_v.localeCompare(b.cells[sort_index].__search_v);
208: else return b.cells[sort_index].__search_v.localeCompare(a.cells[sort_index].__search_v);
209: }
210:
211: function playpause() {
212: rate = 0;
213: if (play) {
214: play = 0;
215: doc_play.innerHTML = "Play";
216: doc_rate.disabled = false;
217: } else {
218: delay = parseInt(doc_rate.value);
219: if (!delay || delay < 1) {
220: doc_status.innerHTML = "Not valid 'refresh' value";
221: return;
222: }
223: play = 1;
224: doc_rate.disabled = true;
225: doc_play.innerHTML = "Pause";
226: setTimeout("callback()", delay * 1000);
227: }
228: }
229:
230: function refresh() {
231: if (xhr_object == null) return;
232: if (xhr_object.readyState > 0 && xhr_object.readyState < 4) {
233: return; /* request is running */
234: }
235: xhr_object.open("GET", doc_url.value, true);
236: xhr_object.onreadystatechange = function() {
237: switch(xhr_object.readyState) {
238: case 0:
239: doc_status.innerHTML = "uninitialized";
240: break;
241: case 1:
242: doc_status.innerHTML = "loading ...";
243: break;
244: case 2:
245: doc_status.innerHTML = "loaded";
246: break;
247: case 3:
248: doc_status.innerHTML = "interactive";
249: break;
250: case 4:
251: doc_status.innerHTML = "complete";
252: if (xhr_object.status == 200) {
253: fpm_status(xhr_object.responseText);
254: } else {
255: doc_status.innerHTML = "Error " + xhr_object.status;
256: }
257: break;
258: }
259: }
260: xhr_object.send();
261: }
262:
263: function callback() {
264: if (!play) return;
265: refresh();
266: setTimeout("callback()", delay * 1000);
267: }
268:
269: function fpm_status(txt) {
270: var json = null;
271:
272: while (doc_short.rows.length > 0) {
273: doc_short.deleteRow(0);
274: }
275:
276: while (doc_active.rows.length > 1) {
277: doc_active.deleteRow(1);
278: }
279:
280: while (doc_idle.rows.length > 1) {
281: doc_idle.deleteRow(1);
282: }
283:
284: try {
285: json = JSON.parse(txt);
286: } catch (e) {
287: doc_status.innerHTML = "Error while parsing json: '" + e + "': <br /><pre>" + txt + "</pre>";
288: return;
289: }
290:
291: for (var key in json) {
292: if (key == "processes") continue;
293: if (key == "state") continue;
294: var row = doc_short.insertRow(doc_short.rows.length);
295: var value = json[key];
296: if (key == "start time") {
297: value = new Date(value * 1000).toLocaleString();
298: }
299: if (key == "start since") {
300: value = time_s(value);
301: }
302: var cell = row.insertCell(row.cells.length);
303: cell.className = "e";
304: cell.innerHTML = key;
305:
306: cell = row.insertCell(row.cells.length);
307: cell.className = "v";
308: cell.innerHTML = value;
309: }
310:
311: if (json.processes) {
312: process_full(json.processes, doc_active, "Idle", 0, 0);
313: reorder(doc_active, order_active_index, order_active_reverse);
314:
315: process_full(json.processes, doc_idle, "Idle", 1, 1);
316: reorder(doc_idle, order_idle_index, order_idle_reverse);
317: }
318: }
319:
320: function process_full(processes, table, state, equal, cpumem) {
321: var odd = 1;
322:
323: for (var i in processes) {
324: var proc = processes[i];
325: if ((equal && proc.state == state) || (!equal && proc.state != state)) {
326: var c = odd++ % 2 == 0 ? "v" : "w";
327: var row = table.insertRow(-1);
328: row.className = c;
329: row.insertCell(-1).innerHTML = proc.pid;
330: row.cells[row.cells.length - 1].__search_v = proc.pid;
331: row.cells[row.cells.length - 1].__search_t = 0;
332:
333: row.insertCell(-1).innerHTML = date(proc['start time'] * 1000);;
334: row.cells[row.cells.length - 1].__search_v = proc['start time'];
335: row.cells[row.cells.length - 1].__search_t = 0;
336:
337: row.insertCell(-1).innerHTML = time_s(proc['start since']);
338: row.cells[row.cells.length - 1].__search_v = proc['start since'];
339: row.cells[row.cells.length - 1].__search_t = 0;
340:
341: row.insertCell(-1).innerHTML = proc.requests;
342: row.cells[row.cells.length - 1].__search_v = proc.requests;
343: row.cells[row.cells.length - 1].__search_t = 0;
344:
345: row.insertCell(-1).innerHTML = time_u(proc['request duration']);
346: row.cells[row.cells.length - 1].__search_v = proc['request duration'];
347: row.cells[row.cells.length - 1].__search_t = 0;
348:
349: row.insertCell(-1).innerHTML = proc['request method'];
350: row.cells[row.cells.length - 1].__search_v = proc['request method'];
351: row.cells[row.cells.length - 1].__search_t = 1;
352:
353: row.insertCell(-1).innerHTML = proc['request uri'];
354: row.cells[row.cells.length - 1].__search_v = proc['request uri'];
355: row.cells[row.cells.length - 1].__search_t = 1;
356:
357: row.insertCell(-1).innerHTML = proc['content length'];
358: row.cells[row.cells.length - 1].__search_v = proc['content length'];
359: row.cells[row.cells.length - 1].__search_t = 0;
360:
361: row.insertCell(-1).innerHTML = proc.user;
362: row.cells[row.cells.length - 1].__search_v = proc.user;
363: row.cells[row.cells.length - 1].__search_t = 1;
364:
365: row.insertCell(-1).innerHTML = proc.script;
366: row.cells[row.cells.length - 1].__search_v = proc.script;
367: row.cells[row.cells.length - 1].__search_t = 1;
368:
369: if (cpumem) {
370: row.insertCell(-1).innerHTML = cpu(proc['last request cpu']);
371: row.cells[row.cells.length - 1].__search_v = proc['last request cpu'];
372: row.cells[row.cells.length - 1].__search_t = 0;
373:
374: row.insertCell(-1).innerHTML = memory(proc['last request memory']);
375: row.cells[row.cells.length - 1].__search_v = proc['last request memory'];
376: row.cells[row.cells.length - 1].__search_t = 0;
377: }
378: }
379: }
380: }
381:
382: function date(d) {
383: var t = new Date(d);
384: var r = "";
385:
386: r += (t.getDate() < 10 ? '0' : '') + t.getDate();
387: r += '/';
388: r += (t.getMonth() + 1 < 10 ? '0' : '') + (t.getMonth() + 1);
389: r += '/';
390: r += t.getFullYear();
391: r += ' ';
392: r += (t.getHours() < 10 ? '0' : '') + t.getHours();
393: r += ':';
394: r += (t.getMinutes() < 10 ? '0' : '') + t.getMinutes();
395: r += ':';
396: r += (t.getSeconds() < 10 ? '0' : '') + t.getSeconds();
397:
398:
399: return r;
400: }
401:
402: function cpu(c) {
403: if (c == 0) return 0;
404: return c + "%";
405: }
406:
407: function memory(mem) {
408: if (mem == 0) return 0;
409: if (mem < 1024) {
410: return mem + "B";
411: }
412: if (mem < 1024 * 1024) {
413: return mem/1024 + "KB";
414: }
415: if (mem < 1024*1024*1024) {
416: return mem/1024/1024 + "MB";
417: }
418: }
419:
420: function time_s(t) {
421: var r = "";
422: if (t < 60) {
423: return t + 's';
424: }
425:
426: r = (t % 60) + 's';
427: t = Math.floor(t / 60);
428: if (t < 60) {
429: return t + 'm ' + r;
430: }
431:
432: r = (t % 60) + 'm ' + r;
433: t = Math.floor(t/60);
434:
435: if (t < 24) {
436: return t + 'h ' + r;
437: }
438:
439: return Math.floor(t/24) + 'd ' + (t % 24) + 'h ' + t;
440: }
441:
442: function time_u(t) {
443: var r = "";
444: if (t < 1000) {
445: return t + 'µs'
446: }
447:
448: r = (t % 1000) + 'µs';
449: t = Math.floor(t / 1000);
450: if (t < 1000) {
451: return t + 'ms ' + r;
452: }
453:
454: return time_s(Math.floor(t/1000)) + ' ' + (t%1000) + 'ms ' + r;
455: }
456: -->
457: </script>
458: </body>
459: </html>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>