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