123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <!--
- $Id$
- (c) 2011 Jerome Loyet
- The PHP License, version 3.01
- This is sample real-time status page for FPM. You can change it to better feet your needs.
- -->
- <head>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
- <style type="text/css">
- body {background-color: #ffffff; color: #000000;}
- body, td, th, h1, h2 {font-family: sans-serif;}
- pre {margin: 0px; font-family: monospace;}
- a:link {color: #000099; text-decoration: none; background-color: #ffffff;}
- a:hover {text-decoration: underline;}
- table {border-collapse: collapse;}
- .center {text-align: center;}
- .center table { margin-left: auto; margin-right: auto; text-align: left;}
- .center th { text-align: center !important; }
- td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}
- h1 {font-size: 150%;}
- h2 {font-size: 125%;}
- .p {text-align: left;}
- .e {background-color: #ccccff; font-weight: bold; color: #000000;}
- .h {background-color: #9999cc; font-weight: bold; color: #000000;}
- .v {background-color: #cccccc; color: #000000;}
- .w {background-color: #ccccff; color: #000000;}
- .h th {
- cursor: pointer;
- }
- img {float: right; border: 0px;}
- hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000000;}
- </style>
- <title>PHP-FPM status page</title>
- <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /></head>
- <body>
- <div class="center">
- <table border="0" cellpadding="3" width="95%">
- <tr class="h">
- <td>
- <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>
- </td>
- </tr>
- </table>
- <br />
- <table border="0" cellpadding="3" width="95%">
- <tr><td class="e">Status URL</td><td class="v"><input type="text" id="url" size="45" /></td></tr>
- <tr><td class="e">Ajax status</td><td class="v" id="status"></td></tr>
- <tr><td class="e">Refresh Rate</td><td class="v"><input type="text" id="rate" value="1" /></td></tr>
- <tr>
- <td class="e">Actions</td>
- <td class="v">
- <button onclick="javascript:refresh();">Manual Refresh</button>
- <button id="play" onclick="javascript:playpause();">Play</button>
- </td>
- </tr>
- </table>
- <h1>Pool Status</h1>
- <table border="0" cellpadding="3" width="95%" id="short">
- <tr style="display: none;"><td> </td></tr>
- </table>
- <h1>Active Processes status</h1>
- <table border="0" cellpadding="3" width="95%" id="active">
- <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>
- </table>
- <h1>Idle Processes status</h1>
- <table border="0" cellpadding="3" width="95%" id="idle">
- <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>
- </table>
- </div>
- <p>
- <a href="http://validator.w3.org/check?uri=referer">
- <img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" />
- </a>
- </p>
- <script type="text/javascript">
- <!--
- var xhr_object = null;
- var doc_url = document.getElementById("url");
- var doc_rate = document.getElementById("rate");
- var doc_status = document.getElementById("status");
- var doc_play = document.getElementById("play");
- var doc_short = document.getElementById("short");
- var doc_active = document.getElementById("active");
- var doc_idle = document.getElementById("idle");
- var rate = 0;
- var play=0;
- var delay = 1000;
- var order_active_index = 0;
- var order_active_reverse = 0;
- var order_idle_index = 0;
- var order_idle_reverse = 0;
- var sort_index;
- var sort_order;
- doc_url.value = location.protocol + '//' + location.host + "/status?json&full";
- ths = document.getElementsByTagName("th");
- for (var i=0; i<ths.length; i++) {
- var th = ths[i];
- if (th.parentNode.className == "h") {
- th.onclick = function() { order(this); return false; };
- }
- }
- xhr_object = create_ajax();
- function create_ajax() {
- if (window.XMLHttpRequest) {
- return new XMLHttpRequest();
- }
- var names = [
- "Msxml2.XMLHTTP.6.0",
- "Msxml2.XMLHTTP.3.0",
- "Msxml2.XMLHTTP",
- "Microsoft.XMLHTTP"
- ];
- for(var i in names)
- {
- try {
- return new ActiveXObject(names[i]);
- } catch(e){}
- }
- alert("Browser not compatible ...");
- }
- function order(cell) {
- var table;
- if (cell.constructor != HTMLTableCellElement && cell.constructor != HTMLTableHeaderCellElement) {
- return;
- }
- table = cell.parentNode.parentNode.parentNode;
- if (table == doc_active) {
- if (order_active_index == cell.cellIndex) {
- if (order_active_reverse == 0) {
- cell.innerHTML = cell.innerHTML.replace(/.$/, "↑");
- order_active_reverse = 1;
- } else {
- cell.innerHTML = cell.innerHTML.replace(/.$/, "↓");
- order_active_reverse = 0;
- }
- } else {
- var c = doc_active.rows[0].cells[order_active_index];
- c.innerHTML = c.innerHTML.replace(/.$/, "");
- cell.innerHTML = cell.innerHTML.replace(/$/, order_active_reverse == 0 ? "↓" : "↑");
- order_active_index = cell.cellIndex;
- }
- reorder(table, order_active_index, order_active_reverse);
- return;
- }
- if (table == doc_idle) {
- if (order_idle_index == cell.cellIndex) {
- if (order_idle_reverse == 0) {
- cell.innerHTML = cell.innerHTML.replace(/.$/, "↑");
- order_idle_reverse = 1;
- } else {
- cell.innerHTML = cell.innerHTML.replace(/.$/, "↓");
- order_idle_reverse = 0;
- }
- } else {
- var c = doc_idle.rows[0].cells[order_idle_index];
- c.innerHTML = c.innerHTML.replace(/.$/, "");
- cell.innerHTML = cell.innerHTML.replace(/$/, order_idle_reverse == 0 ? "↓" : "↑");
- order_idle_index = cell.cellIndex;
- }
- reorder(table, order_idle_index, order_idle_reverse);
- return;
- }
- }
- function reorder(table, index, order) {
- var rows = [];
- while (table.rows.length > 1) {
- rows.push(table.rows[1]);
- table.deleteRow(1);
- }
- sort_index = index;
- sort_order = order;
- rows.sort(sort_table);
- for (var i in rows) {
- table.appendChild(rows[i]);
- }
- var odd = 1;
- for (var i=1; i<table.rows.length; i++) {
- table.rows[i].className = odd++ % 2 == 0 ? "v" : "w";
- }
- return;
- }
- function sort_table(a, b) {
- if (a.cells[0].tagName == "TH") return -1;
- if (b.cells[0].tagName == "TH") return 1;
- if (a.cells[sort_index].__search_t == 0) { /* integer */
- if (!sort_order) return a.cells[sort_index].__search_v - b.cells[sort_index].__search_v;
- return b.cells[sort_index].__search_v - a.cells[sort_index].__search_v;;
- }
- /* string */
- if (!sort_order) return a.cells[sort_index].__search_v.localeCompare(b.cells[sort_index].__search_v);
- else return b.cells[sort_index].__search_v.localeCompare(a.cells[sort_index].__search_v);
- }
- function playpause() {
- rate = 0;
- if (play) {
- play = 0;
- doc_play.innerHTML = "Play";
- doc_rate.disabled = false;
- } else {
- delay = parseInt(doc_rate.value);
- if (!delay || delay < 1) {
- doc_status.innerHTML = "Not valid 'refresh' value";
- return;
- }
- play = 1;
- doc_rate.disabled = true;
- doc_play.innerHTML = "Pause";
- setTimeout("callback()", delay * 1000);
- }
- }
- function refresh() {
- if (xhr_object == null) return;
- if (xhr_object.readyState > 0 && xhr_object.readyState < 4) {
- return; /* request is running */
- }
- xhr_object.open("GET", doc_url.value, true);
- xhr_object.onreadystatechange = function() {
- switch(xhr_object.readyState) {
- case 0:
- doc_status.innerHTML = "uninitialized";
- break;
- case 1:
- doc_status.innerHTML = "loading ...";
- break;
- case 2:
- doc_status.innerHTML = "loaded";
- break;
- case 3:
- doc_status.innerHTML = "interactive";
- break;
- case 4:
- doc_status.innerHTML = "complete";
- if (xhr_object.status == 200) {
- fpm_status(xhr_object.responseText);
- } else {
- doc_status.innerHTML = "Error " + xhr_object.status;
- }
- break;
- }
- }
- xhr_object.send();
- }
- function callback() {
- if (!play) return;
- refresh();
- setTimeout("callback()", delay * 1000);
- }
- function fpm_status(txt) {
- var json = null;
- while (doc_short.rows.length > 0) {
- doc_short.deleteRow(0);
- }
- while (doc_active.rows.length > 1) {
- doc_active.deleteRow(1);
- }
- while (doc_idle.rows.length > 1) {
- doc_idle.deleteRow(1);
- }
- try {
- json = JSON.parse(txt);
- } catch (e) {
- doc_status.innerHTML = "Error while parsing json: '" + e + "': <br /><pre>" + txt + "</pre>";
- return;
- }
- for (var key in json) {
- if (key == "processes") continue;
- if (key == "state") continue;
- var row = doc_short.insertRow(doc_short.rows.length);
- var value = json[key];
- if (key == "start time") {
- value = new Date(value * 1000).toLocaleString();
- }
- if (key == "start since") {
- value = time_s(value);
- }
- var cell = row.insertCell(row.cells.length);
- cell.className = "e";
- cell.innerHTML = key;
- cell = row.insertCell(row.cells.length);
- cell.className = "v";
- cell.innerHTML = value;
- }
- if (json.processes) {
- process_full(json.processes, doc_active, "Idle", 0, 0);
- reorder(doc_active, order_active_index, order_active_reverse);
- process_full(json.processes, doc_idle, "Idle", 1, 1);
- reorder(doc_idle, order_idle_index, order_idle_reverse);
- }
- }
- function process_full(processes, table, state, equal, cpumem) {
- var odd = 1;
- for (var i in processes) {
- var proc = processes[i];
- if ((equal && proc.state == state) || (!equal && proc.state != state)) {
- var c = odd++ % 2 == 0 ? "v" : "w";
- var row = table.insertRow(-1);
- row.className = c;
- row.insertCell(-1).innerHTML = proc.pid;
- row.cells[row.cells.length - 1].__search_v = proc.pid;
- row.cells[row.cells.length - 1].__search_t = 0;
- row.insertCell(-1).innerHTML = date(proc['start time'] * 1000);;
- row.cells[row.cells.length - 1].__search_v = proc['start time'];
- row.cells[row.cells.length - 1].__search_t = 0;
- row.insertCell(-1).innerHTML = time_s(proc['start since']);
- row.cells[row.cells.length - 1].__search_v = proc['start since'];
- row.cells[row.cells.length - 1].__search_t = 0;
- row.insertCell(-1).innerHTML = proc.requests;
- row.cells[row.cells.length - 1].__search_v = proc.requests;
- row.cells[row.cells.length - 1].__search_t = 0;
- row.insertCell(-1).innerHTML = time_u(proc['request duration']);
- row.cells[row.cells.length - 1].__search_v = proc['request duration'];
- row.cells[row.cells.length - 1].__search_t = 0;
- row.insertCell(-1).innerHTML = proc['request method'];
- row.cells[row.cells.length - 1].__search_v = proc['request method'];
- row.cells[row.cells.length - 1].__search_t = 1;
- row.insertCell(-1).innerHTML = proc['request uri'];
- row.cells[row.cells.length - 1].__search_v = proc['request uri'];
- row.cells[row.cells.length - 1].__search_t = 1;
- row.insertCell(-1).innerHTML = proc['content length'];
- row.cells[row.cells.length - 1].__search_v = proc['content length'];
- row.cells[row.cells.length - 1].__search_t = 0;
- row.insertCell(-1).innerHTML = proc.user;
- row.cells[row.cells.length - 1].__search_v = proc.user;
- row.cells[row.cells.length - 1].__search_t = 1;
- row.insertCell(-1).innerHTML = proc.script;
- row.cells[row.cells.length - 1].__search_v = proc.script;
- row.cells[row.cells.length - 1].__search_t = 1;
- if (cpumem) {
- row.insertCell(-1).innerHTML = cpu(proc['last request cpu']);
- row.cells[row.cells.length - 1].__search_v = proc['last request cpu'];
- row.cells[row.cells.length - 1].__search_t = 0;
- row.insertCell(-1).innerHTML = memory(proc['last request memory']);
- row.cells[row.cells.length - 1].__search_v = proc['last request memory'];
- row.cells[row.cells.length - 1].__search_t = 0;
- }
- }
- }
- }
- function date(d) {
- var t = new Date(d);
- var r = "";
- r += (t.getDate() < 10 ? '0' : '') + t.getDate();
- r += '/';
- r += (t.getMonth() + 1 < 10 ? '0' : '') + (t.getMonth() + 1);
- r += '/';
- r += t.getFullYear();
- r += ' ';
- r += (t.getHours() < 10 ? '0' : '') + t.getHours();
- r += ':';
- r += (t.getMinutes() < 10 ? '0' : '') + t.getMinutes();
- r += ':';
- r += (t.getSeconds() < 10 ? '0' : '') + t.getSeconds();
- return r;
- }
- function cpu(c) {
- if (c == 0) return 0;
- return c + "%";
- }
- function memory(mem) {
- if (mem == 0) return 0;
- if (mem < 1024) {
- return mem + "B";
- }
- if (mem < 1024 * 1024) {
- return mem/1024 + "KB";
- }
- if (mem < 1024*1024*1024) {
- return mem/1024/1024 + "MB";
- }
- }
- function time_s(t) {
- var r = "";
- if (t < 60) {
- return t + 's';
- }
- r = (t % 60) + 's';
- t = Math.floor(t / 60);
- if (t < 60) {
- return t + 'm ' + r;
- }
- r = (t % 60) + 'm ' + r;
- t = Math.floor(t/60);
- if (t < 24) {
- return t + 'h ' + r;
- }
- return Math.floor(t/24) + 'd ' + (t % 24) + 'h ' + t;
- }
- function time_u(t) {
- var r = "";
- if (t < 1000) {
- return t + 'µs'
- }
- r = (t % 1000) + 'µs';
- t = Math.floor(t / 1000);
- if (t < 1000) {
- return t + 'ms ' + r;
- }
- return time_s(Math.floor(t/1000)) + ' ' + (t%1000) + 'ms ' + r;
- }
- -->
- </script>
- </body>
- </html>
|