status.html.in 19 KB

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