github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/acceptancetests/repository/xenial/wordpress/files/_debug/apc.php (about) 1 <?php 2 /* 3 +----------------------------------------------------------------------+ 4 | APC | 5 +----------------------------------------------------------------------+ 6 | Copyright (c) 2006-2011 The PHP Group | 7 +----------------------------------------------------------------------+ 8 | This source file is subject to version 3.01 of the PHP license, | 9 | that is bundled with this package in the file LICENSE, and is | 10 | available through the world-wide-web at the following url: | 11 | http://www.php.net/license/3_01.txt | 12 | If you did not receive a copy of the PHP license and are unable to | 13 | obtain it through the world-wide-web, please send a note to | 14 | license@php.net so we can mail you a copy immediately. | 15 +----------------------------------------------------------------------+ 16 | Authors: Ralf Becker <beckerr@php.net> | 17 | Rasmus Lerdorf <rasmus@php.net> | 18 | Ilia Alshanetsky <ilia@prohost.org> | 19 +----------------------------------------------------------------------+ 20 21 All other licensing and usage conditions are those of the PHP Group. 22 23 */ 24 25 $VERSION='$Id$'; 26 27 ////////// READ OPTIONAL CONFIGURATION FILE //////////// 28 if (file_exists("apc.conf.php")) include("apc.conf.php"); 29 //////////////////////////////////////////////////////// 30 31 ////////// BEGIN OF DEFAULT CONFIG AREA /////////////////////////////////////////////////////////// 32 33 defaults('USE_AUTHENTICATION',0); // Use (internal) authentication - best choice if 34 // no other authentication is available 35 // If set to 0: 36 // There will be no further authentication. You 37 // will have to handle this by yourself! 38 // If set to 1: 39 // You need to change ADMIN_PASSWORD to make 40 // this work! 41 defaults('ADMIN_USERNAME',''); // Admin Username 42 defaults('ADMIN_PASSWORD',''); // Admin Password - CHANGE THIS TO ENABLE!!! 43 44 // (beckerr) I'm using a clear text password here, because I've no good idea how to let 45 // users generate a md5 or crypt password in a easy way to fill it in above 46 47 //defaults('DATE_FORMAT', "d.m.Y H:i:s"); // German 48 defaults('DATE_FORMAT', ' m/d/Y h:i:s A'); // US 49 50 defaults('GRAPH_SIZE',150); // Image size 51 52 //defaults('PROXY', 'tcp://127.0.0.1:8080'); 53 54 ////////// END OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////// 55 56 57 // "define if not defined" 58 function defaults($d,$v) { 59 if (!defined($d)) define($d,$v); // or just @define(...) 60 } 61 62 // rewrite $PHP_SELF to block XSS attacks 63 // 64 $PHP_SELF= isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'],''), ENT_QUOTES, 'UTF-8') : ''; 65 $time = time(); 66 $host = php_uname('n'); 67 if($host) { $host = '('.$host.')'; } 68 if (isset($_SERVER['SERVER_ADDR'])) { 69 $host .= ' ('.$_SERVER['SERVER_ADDR'].')'; 70 } 71 72 // operation constants 73 define('OB_HOST_STATS',1); 74 define('OB_SYS_CACHE',2); 75 define('OB_USER_CACHE',3); 76 define('OB_SYS_CACHE_DIR',4); 77 define('OB_VERSION_CHECK',9); 78 79 // check validity of input variables 80 $vardom=array( 81 'OB' => '/^\d+$/', // operational mode switch 82 'CC' => '/^[01]$/', // clear cache requested 83 'DU' => '/^.*$/', // Delete User Key 84 'SH' => '/^[a-z0-9]+$/', // shared object description 85 86 'IMG' => '/^[123]$/', // image to generate 87 'LO' => '/^1$/', // login requested 88 89 'COUNT' => '/^\d+$/', // number of line displayed in list 90 'SCOPE' => '/^[AD]$/', // list view scope 91 'SORT1' => '/^[AHSMCDTZ]$/', // first sort key 92 'SORT2' => '/^[DA]$/', // second sort key 93 'AGGR' => '/^\d+$/', // aggregation by dir level 94 'SEARCH' => '~^[a-zA-Z0-1/_.-]*$~' // aggregation by dir level 95 ); 96 97 // default cache mode 98 $cache_mode='opcode'; 99 100 // cache scope 101 $scope_list=array( 102 'A' => 'cache_list', 103 'D' => 'deleted_list' 104 ); 105 106 // handle POST and GET requests 107 if (empty($_REQUEST)) { 108 if (!empty($_GET) && !empty($_POST)) { 109 $_REQUEST = array_merge($_GET, $_POST); 110 } else if (!empty($_GET)) { 111 $_REQUEST = $_GET; 112 } else if (!empty($_POST)) { 113 $_REQUEST = $_POST; 114 } else { 115 $_REQUEST = array(); 116 } 117 } 118 119 // check parameter syntax 120 foreach($vardom as $var => $dom) { 121 if (!isset($_REQUEST[$var])) { 122 $MYREQUEST[$var]=NULL; 123 } else if (!is_array($_REQUEST[$var]) && preg_match($dom.'D',$_REQUEST[$var])) { 124 $MYREQUEST[$var]=$_REQUEST[$var]; 125 } else { 126 $MYREQUEST[$var]=$_REQUEST[$var]=NULL; 127 } 128 } 129 130 // check parameter sematics 131 if (empty($MYREQUEST['SCOPE'])) $MYREQUEST['SCOPE']="A"; 132 if (empty($MYREQUEST['SORT1'])) $MYREQUEST['SORT1']="H"; 133 if (empty($MYREQUEST['SORT2'])) $MYREQUEST['SORT2']="D"; 134 if (empty($MYREQUEST['OB'])) $MYREQUEST['OB']=OB_HOST_STATS; 135 if (!isset($MYREQUEST['COUNT'])) $MYREQUEST['COUNT']=20; 136 if (!isset($scope_list[$MYREQUEST['SCOPE']])) $MYREQUEST['SCOPE']='A'; 137 138 $MY_SELF= 139 "$PHP_SELF". 140 "?SCOPE=".$MYREQUEST['SCOPE']. 141 "&SORT1=".$MYREQUEST['SORT1']. 142 "&SORT2=".$MYREQUEST['SORT2']. 143 "&COUNT=".$MYREQUEST['COUNT']; 144 $MY_SELF_WO_SORT= 145 "$PHP_SELF". 146 "?SCOPE=".$MYREQUEST['SCOPE']. 147 "&COUNT=".$MYREQUEST['COUNT']; 148 149 // authentication needed? 150 // 151 if (!USE_AUTHENTICATION) { 152 $AUTHENTICATED=1; 153 } else { 154 $AUTHENTICATED=0; 155 if (ADMIN_PASSWORD!='password' && ($MYREQUEST['LO'] == 1 || isset($_SERVER['PHP_AUTH_USER']))) { 156 157 if (!isset($_SERVER['PHP_AUTH_USER']) || 158 !isset($_SERVER['PHP_AUTH_PW']) || 159 $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME || 160 $_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) { 161 Header("WWW-Authenticate: Basic realm=\"APC Login\""); 162 Header("HTTP/1.0 401 Unauthorized"); 163 164 echo <<<EOB 165 <html><body> 166 <h1>Rejected!</h1> 167 <big>Wrong Username or Password!</big><br/> <br/> 168 <big><a href='$PHP_SELF?OB={$MYREQUEST['OB']}'>Continue...</a></big> 169 </body></html> 170 EOB; 171 exit; 172 173 } else { 174 $AUTHENTICATED=1; 175 } 176 } 177 } 178 179 // select cache mode 180 if ($AUTHENTICATED && $MYREQUEST['OB'] == OB_USER_CACHE) { 181 $cache_mode='user'; 182 } 183 // clear cache 184 if ($AUTHENTICATED && isset($MYREQUEST['CC']) && $MYREQUEST['CC']) { 185 apc_clear_cache($cache_mode); 186 } 187 188 if ($AUTHENTICATED && !empty($MYREQUEST['DU'])) { 189 apc_delete($MYREQUEST['DU']); 190 } 191 192 if(!function_exists('apc_cache_info') || !($cache=@apc_cache_info($cache_mode))) { 193 echo "No cache info available. APC does not appear to be running."; 194 exit; 195 } 196 197 $cache_user = apc_cache_info('user', 1); 198 $mem=apc_sma_info(); 199 if(!$cache['num_hits']) { $cache['num_hits']=1; $time++; } // Avoid division by 0 errors on a cache clear 200 201 // don't cache this page 202 // 203 header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1 204 header("Cache-Control: post-check=0, pre-check=0", false); 205 header("Pragma: no-cache"); // HTTP/1.0 206 207 function duration($ts) { 208 global $time; 209 $years = (int)((($time - $ts)/(7*86400))/52.177457); 210 $rem = (int)(($time-$ts)-($years * 52.177457 * 7 * 86400)); 211 $weeks = (int)(($rem)/(7*86400)); 212 $days = (int)(($rem)/86400) - $weeks*7; 213 $hours = (int)(($rem)/3600) - $days*24 - $weeks*7*24; 214 $mins = (int)(($rem)/60) - $hours*60 - $days*24*60 - $weeks*7*24*60; 215 $str = ''; 216 if($years==1) $str .= "$years year, "; 217 if($years>1) $str .= "$years years, "; 218 if($weeks==1) $str .= "$weeks week, "; 219 if($weeks>1) $str .= "$weeks weeks, "; 220 if($days==1) $str .= "$days day,"; 221 if($days>1) $str .= "$days days,"; 222 if($hours == 1) $str .= " $hours hour and"; 223 if($hours>1) $str .= " $hours hours and"; 224 if($mins == 1) $str .= " 1 minute"; 225 else $str .= " $mins minutes"; 226 return $str; 227 } 228 229 // create graphics 230 // 231 function graphics_avail() { 232 return extension_loaded('gd'); 233 } 234 if (isset($MYREQUEST['IMG'])) 235 { 236 if (!graphics_avail()) { 237 exit(0); 238 } 239 240 function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1,$color2,$text='',$placeindex=0) { 241 $r=$diameter/2; 242 $w=deg2rad((360+$start+($end-$start)/2)%360); 243 244 245 if (function_exists("imagefilledarc")) { 246 // exists only if GD 2.0.1 is available 247 imagefilledarc($im, $centerX+1, $centerY+1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE); 248 imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE); 249 imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL|IMG_ARC_EDGED); 250 } else { 251 imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2); 252 imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); 253 imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start+1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); 254 imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end-1)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2); 255 imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2); 256 imagefill($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2, $color2); 257 } 258 if ($text) { 259 if ($placeindex>0) { 260 imageline($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$diameter, $placeindex*12,$color1); 261 imagestring($im,4,$diameter, $placeindex*12,$text,$color1); 262 263 } else { 264 imagestring($im,4,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$text,$color1); 265 } 266 } 267 } 268 269 function text_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1,$text,$placeindex=0) { 270 $r=$diameter/2; 271 $w=deg2rad((360+$start+($end-$start)/2)%360); 272 273 if ($placeindex>0) { 274 imageline($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$diameter, $placeindex*12,$color1); 275 imagestring($im,4,$diameter, $placeindex*12,$text,$color1); 276 277 } else { 278 imagestring($im,4,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$text,$color1); 279 } 280 } 281 282 function fill_box($im, $x, $y, $w, $h, $color1, $color2,$text='',$placeindex='') { 283 global $col_black; 284 $x1=$x+$w-1; 285 $y1=$y+$h-1; 286 287 imagerectangle($im, $x, $y1, $x1+1, $y+1, $col_black); 288 if($y1>$y) imagefilledrectangle($im, $x, $y, $x1, $y1, $color2); 289 else imagefilledrectangle($im, $x, $y1, $x1, $y, $color2); 290 imagerectangle($im, $x, $y1, $x1, $y, $color1); 291 if ($text) { 292 if ($placeindex>0) { 293 294 if ($placeindex<16) 295 { 296 $px=5; 297 $py=$placeindex*12+6; 298 imagefilledrectangle($im, $px+90, $py+3, $px+90-4, $py-3, $color2); 299 imageline($im,$x,$y+$h/2,$px+90,$py,$color2); 300 imagestring($im,2,$px,$py-6,$text,$color1); 301 302 } else { 303 if ($placeindex<31) { 304 $px=$x+40*2; 305 $py=($placeindex-15)*12+6; 306 } else { 307 $px=$x+40*2+100*intval(($placeindex-15)/15); 308 $py=($placeindex%15)*12+6; 309 } 310 imagefilledrectangle($im, $px, $py+3, $px-4, $py-3, $color2); 311 imageline($im,$x+$w,$y+$h/2,$px,$py,$color2); 312 imagestring($im,2,$px+2,$py-6,$text,$color1); 313 } 314 } else { 315 imagestring($im,4,$x+5,$y1-16,$text,$color1); 316 } 317 } 318 } 319 320 321 $size = GRAPH_SIZE; // image size 322 if ($MYREQUEST['IMG']==3) 323 $image = imagecreate(2*$size+150, $size+10); 324 else 325 $image = imagecreate($size+50, $size+10); 326 327 $col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); 328 $col_red = imagecolorallocate($image, 0xD0, 0x60, 0x30); 329 $col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60); 330 $col_black = imagecolorallocate($image, 0, 0, 0); 331 imagecolortransparent($image,$col_white); 332 333 switch ($MYREQUEST['IMG']) { 334 335 case 1: 336 $s=$mem['num_seg']*$mem['seg_size']; 337 $a=$mem['avail_mem']; 338 $x=$y=$size/2; 339 $fuzz = 0.000001; 340 341 // This block of code creates the pie chart. It is a lot more complex than you 342 // would expect because we try to visualize any memory fragmentation as well. 343 $angle_from = 0; 344 $string_placement=array(); 345 for($i=0; $i<$mem['num_seg']; $i++) { 346 $ptr = 0; 347 $free = $mem['block_lists'][$i]; 348 uasort($free, 'block_sort'); 349 foreach($free as $block) { 350 if($block['offset']!=$ptr) { // Used block 351 $angle_to = $angle_from+($block['offset']-$ptr)/$s; 352 if(($angle_to+$fuzz)>1) $angle_to = 1; 353 if( ($angle_to*360) - ($angle_from*360) >= 1) { 354 fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red); 355 if (($angle_to-$angle_from)>0.05) { 356 array_push($string_placement, array($angle_from,$angle_to)); 357 } 358 } 359 $angle_from = $angle_to; 360 } 361 $angle_to = $angle_from+($block['size'])/$s; 362 if(($angle_to+$fuzz)>1) $angle_to = 1; 363 if( ($angle_to*360) - ($angle_from*360) >= 1) { 364 fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_green); 365 if (($angle_to-$angle_from)>0.05) { 366 array_push($string_placement, array($angle_from,$angle_to)); 367 } 368 } 369 $angle_from = $angle_to; 370 $ptr = $block['offset']+$block['size']; 371 } 372 if ($ptr < $mem['seg_size']) { // memory at the end 373 $angle_to = $angle_from + ($mem['seg_size'] - $ptr)/$s; 374 if(($angle_to+$fuzz)>1) $angle_to = 1; 375 fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red); 376 if (($angle_to-$angle_from)>0.05) { 377 array_push($string_placement, array($angle_from,$angle_to)); 378 } 379 } 380 } 381 foreach ($string_placement as $angle) { 382 text_arc($image,$x,$y,$size,$angle[0]*360,$angle[1]*360,$col_black,bsize($s*($angle[1]-$angle[0]))); 383 } 384 break; 385 386 case 2: 387 $s=$cache['num_hits']+$cache['num_misses']; 388 $a=$cache['num_hits']; 389 390 fill_box($image, 30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s)); 391 fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s)); 392 break; 393 394 case 3: 395 $s=$mem['num_seg']*$mem['seg_size']; 396 $a=$mem['avail_mem']; 397 $x=130; 398 $y=1; 399 $j=1; 400 401 // This block of code creates the bar chart. It is a lot more complex than you 402 // would expect because we try to visualize any memory fragmentation as well. 403 for($i=0; $i<$mem['num_seg']; $i++) { 404 $ptr = 0; 405 $free = $mem['block_lists'][$i]; 406 uasort($free, 'block_sort'); 407 foreach($free as $block) { 408 if($block['offset']!=$ptr) { // Used block 409 $h=(GRAPH_SIZE-5)*($block['offset']-$ptr)/$s; 410 if ($h>0) { 411 $j++; 412 if($j<75) fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($block['offset']-$ptr),$j); 413 else fill_box($image,$x,$y,50,$h,$col_black,$col_red); 414 } 415 $y+=$h; 416 } 417 $h=(GRAPH_SIZE-5)*($block['size'])/$s; 418 if ($h>0) { 419 $j++; 420 if($j<75) fill_box($image,$x,$y,50,$h,$col_black,$col_green,bsize($block['size']),$j); 421 else fill_box($image,$x,$y,50,$h,$col_black,$col_green); 422 } 423 $y+=$h; 424 $ptr = $block['offset']+$block['size']; 425 } 426 if ($ptr < $mem['seg_size']) { // memory at the end 427 $h = (GRAPH_SIZE-5) * ($mem['seg_size'] - $ptr) / $s; 428 if ($h > 0) { 429 fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($mem['seg_size']-$ptr),$j++); 430 } 431 } 432 } 433 break; 434 case 4: 435 $s=$cache['num_hits']+$cache['num_misses']; 436 $a=$cache['num_hits']; 437 438 fill_box($image, 30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s)); 439 fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s)); 440 break; 441 442 } 443 header("Content-type: image/png"); 444 imagepng($image); 445 exit; 446 } 447 448 // pretty printer for byte values 449 // 450 function bsize($s) { 451 foreach (array('','K','M','G') as $i => $k) { 452 if ($s < 1024) break; 453 $s/=1024; 454 } 455 return sprintf("%5.1f %sBytes",$s,$k); 456 } 457 458 // sortable table header in "scripts for this host" view 459 function sortheader($key,$name,$extra='') { 460 global $MYREQUEST, $MY_SELF_WO_SORT; 461 462 if ($MYREQUEST['SORT1']==$key) { 463 $MYREQUEST['SORT2'] = $MYREQUEST['SORT2']=='A' ? 'D' : 'A'; 464 } 465 return "<a class=sortable href=\"$MY_SELF_WO_SORT$extra&SORT1=$key&SORT2=".$MYREQUEST['SORT2']."\">$name</a>"; 466 467 } 468 469 // create menu entry 470 function menu_entry($ob,$title) { 471 global $MYREQUEST,$MY_SELF; 472 if ($MYREQUEST['OB']!=$ob) { 473 return "<li><a href=\"$MY_SELF&OB=$ob\">$title</a></li>"; 474 } else if (empty($MYREQUEST['SH'])) { 475 return "<li><span class=active>$title</span></li>"; 476 } else { 477 return "<li><a class=\"child_active\" href=\"$MY_SELF&OB=$ob\">$title</a></li>"; 478 } 479 } 480 481 function put_login_link($s="Login") 482 { 483 global $MY_SELF,$MYREQUEST,$AUTHENTICATED; 484 // needs ADMIN_PASSWORD to be changed! 485 // 486 if (!USE_AUTHENTICATION) { 487 return; 488 } else if (ADMIN_PASSWORD=='password') 489 { 490 print <<<EOB 491 <a href="#" onClick="javascript:alert('You need to set a password at the top of apc.php before this will work!');return false";>$s</a> 492 EOB; 493 } else if ($AUTHENTICATED) { 494 print <<<EOB 495 '{$_SERVER['PHP_AUTH_USER']}' logged in! 496 EOB; 497 } else{ 498 print <<<EOB 499 <a href="$MY_SELF&LO=1&OB={$MYREQUEST['OB']}">$s</a> 500 EOB; 501 } 502 } 503 504 function block_sort($array1, $array2) 505 { 506 if ($array1['offset'] > $array2['offset']) { 507 return 1; 508 } else { 509 return -1; 510 } 511 } 512 513 514 ?> 515 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 516 <html> 517 <head><title>APC INFO <?php echo $host ?></title> 518 <style><!-- 519 body { background:white; font-size:100.01%; margin:0; padding:0; } 520 body,p,td,th,input,submit { font-size:0.8em;font-family:arial,helvetica,sans-serif; } 521 * html body {font-size:0.8em} 522 * html p {font-size:0.8em} 523 * html td {font-size:0.8em} 524 * html th {font-size:0.8em} 525 * html input {font-size:0.8em} 526 * html submit {font-size:0.8em} 527 td { vertical-align:top } 528 a { color:black; font-weight:none; text-decoration:none; } 529 a:hover { text-decoration:underline; } 530 div.content { padding:1em 1em 1em 1em; position:absolute; width:97%; z-index:100; } 531 532 533 div.head div.login { 534 position:absolute; 535 right: 1em; 536 top: 1.2em; 537 color:white; 538 width:6em; 539 } 540 div.head div.login a { 541 position:absolute; 542 right: 0em; 543 background:rgb(119,123,180); 544 border:solid rgb(102,102,153) 2px; 545 color:white; 546 font-weight:bold; 547 padding:0.1em 0.5em 0.1em 0.5em; 548 text-decoration:none; 549 } 550 div.head div.login a:hover { 551 background:rgb(193,193,244); 552 } 553 554 h1.apc { background:rgb(153,153,204); margin:0; padding:0.5em 1em 0.5em 1em; } 555 * html h1.apc { margin-bottom:-7px; } 556 h1.apc a:hover { text-decoration:none; color:rgb(90,90,90); } 557 h1.apc div.logo span.logo { 558 background:rgb(119,123,180); 559 color:black; 560 border-right: solid black 1px; 561 border-bottom: solid black 1px; 562 font-style:italic; 563 font-size:1em; 564 padding-left:1.2em; 565 padding-right:1.2em; 566 text-align:right; 567 } 568 h1.apc div.logo span.name { color:white; font-size:0.7em; padding:0 0.8em 0 2em; } 569 h1.apc div.nameinfo { color:white; display:inline; font-size:0.4em; margin-left: 3em; } 570 h1.apc div.copy { color:black; font-size:0.4em; position:absolute; right:1em; } 571 hr.apc { 572 background:white; 573 border-bottom:solid rgb(102,102,153) 1px; 574 border-style:none; 575 border-top:solid rgb(102,102,153) 10px; 576 height:12px; 577 margin:0; 578 margin-top:1px; 579 padding:0; 580 } 581 582 ol,menu { margin:1em 0 0 0; padding:0.2em; margin-left:1em;} 583 ol.menu li { display:inline; margin-right:0.7em; list-style:none; font-size:85%} 584 ol.menu a { 585 background:rgb(153,153,204); 586 border:solid rgb(102,102,153) 2px; 587 color:white; 588 font-weight:bold; 589 margin-right:0em; 590 padding:0.1em 0.5em 0.1em 0.5em; 591 text-decoration:none; 592 margin-left: 5px; 593 } 594 ol.menu a.child_active { 595 background:rgb(153,153,204); 596 border:solid rgb(102,102,153) 2px; 597 color:white; 598 font-weight:bold; 599 margin-right:0em; 600 padding:0.1em 0.5em 0.1em 0.5em; 601 text-decoration:none; 602 border-left: solid black 5px; 603 margin-left: 0px; 604 } 605 ol.menu span.active { 606 background:rgb(153,153,204); 607 border:solid rgb(102,102,153) 2px; 608 color:black; 609 font-weight:bold; 610 margin-right:0em; 611 padding:0.1em 0.5em 0.1em 0.5em; 612 text-decoration:none; 613 border-left: solid black 5px; 614 } 615 ol.menu span.inactive { 616 background:rgb(193,193,244); 617 border:solid rgb(182,182,233) 2px; 618 color:white; 619 font-weight:bold; 620 margin-right:0em; 621 padding:0.1em 0.5em 0.1em 0.5em; 622 text-decoration:none; 623 margin-left: 5px; 624 } 625 ol.menu a:hover { 626 background:rgb(193,193,244); 627 text-decoration:none; 628 } 629 630 631 div.info { 632 background:rgb(204,204,204); 633 border:solid rgb(204,204,204) 1px; 634 margin-bottom:1em; 635 } 636 div.info h2 { 637 background:rgb(204,204,204); 638 color:black; 639 font-size:1em; 640 margin:0; 641 padding:0.1em 1em 0.1em 1em; 642 } 643 div.info table { 644 border:solid rgb(204,204,204) 1px; 645 border-spacing:0; 646 width:100%; 647 } 648 div.info table th { 649 background:rgb(204,204,204); 650 color:white; 651 margin:0; 652 padding:0.1em 1em 0.1em 1em; 653 } 654 div.info table th a.sortable { color:black; } 655 div.info table tr.tr-0 { background:rgb(238,238,238); } 656 div.info table tr.tr-1 { background:rgb(221,221,221); } 657 div.info table td { padding:0.3em 1em 0.3em 1em; } 658 div.info table td.td-0 { border-right:solid rgb(102,102,153) 1px; white-space:nowrap; } 659 div.info table td.td-n { border-right:solid rgb(102,102,153) 1px; } 660 div.info table td h3 { 661 color:black; 662 font-size:1.1em; 663 margin-left:-0.3em; 664 } 665 666 div.graph { margin-bottom:1em } 667 div.graph h2 { background:rgb(204,204,204);; color:black; font-size:1em; margin:0; padding:0.1em 1em 0.1em 1em; } 668 div.graph table { border:solid rgb(204,204,204) 1px; color:black; font-weight:normal; width:100%; } 669 div.graph table td.td-0 { background:rgb(238,238,238); } 670 div.graph table td.td-1 { background:rgb(221,221,221); } 671 div.graph table td { padding:0.2em 1em 0.4em 1em; } 672 673 div.div1,div.div2 { margin-bottom:1em; width:35em; } 674 div.div3 { position:absolute; left:40em; top:1em; width:580px; } 675 //div.div3 { position:absolute; left:37em; top:1em; right:1em; } 676 677 div.sorting { margin:1.5em 0em 1.5em 2em } 678 .center { text-align:center } 679 .aright { position:absolute;right:1em } 680 .right { text-align:right } 681 .ok { color:rgb(0,200,0); font-weight:bold} 682 .failed { color:rgb(200,0,0); font-weight:bold} 683 684 span.box { 685 border: black solid 1px; 686 border-right:solid black 2px; 687 border-bottom:solid black 2px; 688 padding:0 0.5em 0 0.5em; 689 margin-right:1em; 690 } 691 span.green { background:#60F060; padding:0 0.5em 0 0.5em} 692 span.red { background:#D06030; padding:0 0.5em 0 0.5em } 693 694 div.authneeded { 695 background:rgb(238,238,238); 696 border:solid rgb(204,204,204) 1px; 697 color:rgb(200,0,0); 698 font-size:1.2em; 699 font-weight:bold; 700 padding:2em; 701 text-align:center; 702 } 703 704 input { 705 background:rgb(153,153,204); 706 border:solid rgb(102,102,153) 2px; 707 color:white; 708 font-weight:bold; 709 margin-right:1em; 710 padding:0.1em 0.5em 0.1em 0.5em; 711 } 712 //--> 713 </style> 714 </head> 715 <body> 716 <div class="head"> 717 <h1 class="apc"> 718 <div class="logo"><span class="logo"><a href="http://pecl.php.net/package/APC">APC</a></span></div> 719 <div class="nameinfo">Opcode Cache</div> 720 </h1> 721 <div class="login"> 722 <?php put_login_link(); ?> 723 </div> 724 <hr class="apc"> 725 </div> 726 <?php 727 728 729 // Display main Menu 730 echo <<<EOB 731 <ol class=menu> 732 <li><a href="$MY_SELF&OB={$MYREQUEST['OB']}&SH={$MYREQUEST['SH']}">Refresh Data</a></li> 733 EOB; 734 echo 735 menu_entry(1,'View Host Stats'), 736 menu_entry(2,'System Cache Entries'); 737 if ($AUTHENTICATED) { 738 echo menu_entry(4,'Per-Directory Entries'); 739 } 740 echo 741 menu_entry(3,'User Cache Entries'), 742 menu_entry(9,'Version Check'); 743 744 if ($AUTHENTICATED) { 745 echo <<<EOB 746 <li><a class="aright" href="$MY_SELF&CC=1&OB={$MYREQUEST['OB']}" onClick="javascript:return confirm('Are you sure?');">Clear $cache_mode Cache</a></li> 747 EOB; 748 } 749 echo <<<EOB 750 </ol> 751 EOB; 752 753 754 // CONTENT 755 echo <<<EOB 756 <div class=content> 757 EOB; 758 759 // MAIN SWITCH STATEMENT 760 761 switch ($MYREQUEST['OB']) { 762 763 764 765 766 767 // ----------------------------------------------- 768 // Host Stats 769 // ----------------------------------------------- 770 case OB_HOST_STATS: 771 $mem_size = $mem['num_seg']*$mem['seg_size']; 772 $mem_avail= $mem['avail_mem']; 773 $mem_used = $mem_size-$mem_avail; 774 $seg_size = bsize($mem['seg_size']); 775 $req_rate = sprintf("%.2f",($cache['num_hits']+$cache['num_misses'])/($time-$cache['start_time'])); 776 $hit_rate = sprintf("%.2f",($cache['num_hits'])/($time-$cache['start_time'])); 777 $miss_rate = sprintf("%.2f",($cache['num_misses'])/($time-$cache['start_time'])); 778 $insert_rate = sprintf("%.2f",($cache['num_inserts'])/($time-$cache['start_time'])); 779 $req_rate_user = sprintf("%.2f",($cache_user['num_hits']+$cache_user['num_misses'])/($time-$cache_user['start_time'])); 780 $hit_rate_user = sprintf("%.2f",($cache_user['num_hits'])/($time-$cache_user['start_time'])); 781 $miss_rate_user = sprintf("%.2f",($cache_user['num_misses'])/($time-$cache_user['start_time'])); 782 $insert_rate_user = sprintf("%.2f",($cache_user['num_inserts'])/($time-$cache_user['start_time'])); 783 $apcversion = phpversion('apc'); 784 $phpversion = phpversion(); 785 $number_files = $cache['num_entries']; 786 $size_files = bsize($cache['mem_size']); 787 $number_vars = $cache_user['num_entries']; 788 $size_vars = bsize($cache_user['mem_size']); 789 $i=0; 790 echo <<< EOB 791 <div class="info div1"><h2>General Cache Information</h2> 792 <table cellspacing=0><tbody> 793 <tr class=tr-0><td class=td-0>APC Version</td><td>$apcversion</td></tr> 794 <tr class=tr-1><td class=td-0>PHP Version</td><td>$phpversion</td></tr> 795 EOB; 796 797 if(!empty($_SERVER['SERVER_NAME'])) 798 echo "<tr class=tr-0><td class=td-0>APC Host</td><td>{$_SERVER['SERVER_NAME']} $host</td></tr>\n"; 799 if(!empty($_SERVER['SERVER_SOFTWARE'])) 800 echo "<tr class=tr-1><td class=td-0>Server Software</td><td>{$_SERVER['SERVER_SOFTWARE']}</td></tr>\n"; 801 802 echo <<<EOB 803 <tr class=tr-0><td class=td-0>Shared Memory</td><td>{$mem['num_seg']} Segment(s) with $seg_size 804 <br/> ({$cache['memory_type']} memory, {$cache['locking_type']} locking) 805 </td></tr> 806 EOB; 807 echo '<tr class=tr-1><td class=td-0>Start Time</td><td>',date(DATE_FORMAT,$cache['start_time']),'</td></tr>'; 808 echo '<tr class=tr-0><td class=td-0>Uptime</td><td>',duration($cache['start_time']),'</td></tr>'; 809 echo '<tr class=tr-1><td class=td-0>File Upload Support</td><td>',$cache['file_upload_progress'],'</td></tr>'; 810 echo <<<EOB 811 </tbody></table> 812 </div> 813 814 <div class="info div1"><h2>File Cache Information</h2> 815 <table cellspacing=0><tbody> 816 <tr class=tr-0><td class=td-0>Cached Files</td><td>$number_files ($size_files)</td></tr> 817 <tr class=tr-1><td class=td-0>Hits</td><td>{$cache['num_hits']}</td></tr> 818 <tr class=tr-0><td class=td-0>Misses</td><td>{$cache['num_misses']}</td></tr> 819 <tr class=tr-1><td class=td-0>Request Rate (hits, misses)</td><td>$req_rate cache requests/second</td></tr> 820 <tr class=tr-0><td class=td-0>Hit Rate</td><td>$hit_rate cache requests/second</td></tr> 821 <tr class=tr-1><td class=td-0>Miss Rate</td><td>$miss_rate cache requests/second</td></tr> 822 <tr class=tr-0><td class=td-0>Insert Rate</td><td>$insert_rate cache requests/second</td></tr> 823 <tr class=tr-1><td class=td-0>Cache full count</td><td>{$cache['expunges']}</td></tr> 824 </tbody></table> 825 </div> 826 827 <div class="info div1"><h2>User Cache Information</h2> 828 <table cellspacing=0><tbody> 829 <tr class=tr-0><td class=td-0>Cached Variables</td><td>$number_vars ($size_vars)</td></tr> 830 <tr class=tr-1><td class=td-0>Hits</td><td>{$cache_user['num_hits']}</td></tr> 831 <tr class=tr-0><td class=td-0>Misses</td><td>{$cache_user['num_misses']}</td></tr> 832 <tr class=tr-1><td class=td-0>Request Rate (hits, misses)</td><td>$req_rate_user cache requests/second</td></tr> 833 <tr class=tr-0><td class=td-0>Hit Rate</td><td>$hit_rate_user cache requests/second</td></tr> 834 <tr class=tr-1><td class=td-0>Miss Rate</td><td>$miss_rate_user cache requests/second</td></tr> 835 <tr class=tr-0><td class=td-0>Insert Rate</td><td>$insert_rate_user cache requests/second</td></tr> 836 <tr class=tr-1><td class=td-0>Cache full count</td><td>{$cache_user['expunges']}</td></tr> 837 838 </tbody></table> 839 </div> 840 841 <div class="info div2"><h2>Runtime Settings</h2><table cellspacing=0><tbody> 842 EOB; 843 844 $j = 0; 845 foreach (ini_get_all('apc') as $k => $v) { 846 echo "<tr class=tr-$j><td class=td-0>",$k,"</td><td>",str_replace(',',',<br />',$v['local_value']),"</td></tr>\n"; 847 $j = 1 - $j; 848 } 849 850 if($mem['num_seg']>1 || $mem['num_seg']==1 && count($mem['block_lists'][0])>1) 851 $mem_note = "Memory Usage<br /><font size=-2>(multiple slices indicate fragments)</font>"; 852 else 853 $mem_note = "Memory Usage"; 854 855 echo <<< EOB 856 </tbody></table> 857 </div> 858 859 <div class="graph div3"><h2>Host Status Diagrams</h2> 860 <table cellspacing=0><tbody> 861 EOB; 862 $size='width='.(GRAPH_SIZE+50).' height='.(GRAPH_SIZE+10); 863 echo <<<EOB 864 <tr> 865 <td class=td-0>$mem_note</td> 866 <td class=td-1>Hits & Misses</td> 867 </tr> 868 EOB; 869 870 echo 871 graphics_avail() ? 872 '<tr>'. 873 "<td class=td-0><img alt=\"\" $size src=\"$PHP_SELF?IMG=1&$time\"></td>". 874 "<td class=td-1><img alt=\"\" $size src=\"$PHP_SELF?IMG=2&$time\"></td></tr>\n" 875 : "", 876 '<tr>', 877 '<td class=td-0><span class="green box"> </span>Free: ',bsize($mem_avail).sprintf(" (%.1f%%)",$mem_avail*100/$mem_size),"</td>\n", 878 '<td class=td-1><span class="green box"> </span>Hits: ',$cache['num_hits'].sprintf(" (%.1f%%)",$cache['num_hits']*100/($cache['num_hits']+$cache['num_misses'])),"</td>\n", 879 '</tr>', 880 '<tr>', 881 '<td class=td-0><span class="red box"> </span>Used: ',bsize($mem_used ).sprintf(" (%.1f%%)",$mem_used *100/$mem_size),"</td>\n", 882 '<td class=td-1><span class="red box"> </span>Misses: ',$cache['num_misses'].sprintf(" (%.1f%%)",$cache['num_misses']*100/($cache['num_hits']+$cache['num_misses'])),"</td>\n"; 883 echo <<< EOB 884 </tr> 885 </tbody></table> 886 887 <br/> 888 <h2>Detailed Memory Usage and Fragmentation</h2> 889 <table cellspacing=0><tbody> 890 <tr> 891 <td class=td-0 colspan=2><br/> 892 EOB; 893 894 // Fragementation: (freeseg - 1) / total_seg 895 $nseg = $freeseg = $fragsize = $freetotal = 0; 896 for($i=0; $i<$mem['num_seg']; $i++) { 897 $ptr = 0; 898 foreach($mem['block_lists'][$i] as $block) { 899 if ($block['offset'] != $ptr) { 900 ++$nseg; 901 } 902 $ptr = $block['offset'] + $block['size']; 903 /* Only consider blocks <5M for the fragmentation % */ 904 if($block['size']<(5*1024*1024)) $fragsize+=$block['size']; 905 $freetotal+=$block['size']; 906 } 907 $freeseg += count($mem['block_lists'][$i]); 908 } 909 910 if ($freeseg > 1) { 911 $frag = sprintf("%.2f%% (%s out of %s in %d fragments)", ($fragsize/$freetotal)*100,bsize($fragsize),bsize($freetotal),$freeseg); 912 } else { 913 $frag = "0%"; 914 } 915 916 if (graphics_avail()) { 917 $size='width='.(2*GRAPH_SIZE+150).' height='.(GRAPH_SIZE+10); 918 echo <<<EOB 919 <img alt="" $size src="$PHP_SELF?IMG=3&$time"> 920 EOB; 921 } 922 echo <<<EOB 923 </br>Fragmentation: $frag 924 </td> 925 </tr> 926 EOB; 927 if(isset($mem['adist'])) { 928 foreach($mem['adist'] as $i=>$v) { 929 $cur = pow(2,$i); $nxt = pow(2,$i+1)-1; 930 if($i==0) $range = "1"; 931 else $range = "$cur - $nxt"; 932 echo "<tr><th align=right>$range</th><td align=right>$v</td></tr>\n"; 933 } 934 } 935 echo <<<EOB 936 </tbody></table> 937 </div> 938 EOB; 939 940 break; 941 942 943 // ----------------------------------------------- 944 // User Cache Entries 945 // ----------------------------------------------- 946 case OB_USER_CACHE: 947 if (!$AUTHENTICATED) { 948 echo '<div class="error">You need to login to see the user values here!<br/> <br/>'; 949 put_login_link("Login now!"); 950 echo '</div>'; 951 break; 952 } 953 $fieldname='info'; 954 $fieldheading='User Entry Label'; 955 $fieldkey='info'; 956 957 // ----------------------------------------------- 958 // System Cache Entries 959 // ----------------------------------------------- 960 case OB_SYS_CACHE: 961 if (!isset($fieldname)) 962 { 963 $fieldname='filename'; 964 $fieldheading='Script Filename'; 965 if(ini_get("apc.stat")) $fieldkey='inode'; 966 else $fieldkey='filename'; 967 } 968 if (!empty($MYREQUEST['SH'])) 969 { 970 echo <<< EOB 971 <div class="info"><table cellspacing=0><tbody> 972 <tr><th>Attribute</th><th>Value</th></tr> 973 EOB; 974 975 $m=0; 976 foreach($scope_list as $j => $list) { 977 foreach($cache[$list] as $i => $entry) { 978 if (md5($entry[$fieldkey])!=$MYREQUEST['SH']) continue; 979 foreach($entry as $k => $value) { 980 if (!$AUTHENTICATED) { 981 // hide all path entries if not logged in 982 $value=preg_replace('/^.*(\\/|\\\\)/','<i><hidden></i>/',$value); 983 } 984 985 if ($k == "num_hits") { 986 $value=sprintf("%s (%.2f%%)",$value,$value*100/$cache['num_hits']); 987 } 988 if ($k == 'deletion_time') { 989 if(!$entry['deletion_time']) $value = "None"; 990 } 991 echo 992 "<tr class=tr-$m>", 993 "<td class=td-0>",ucwords(preg_replace("/_/"," ",$k)),"</td>", 994 "<td class=td-last>",(preg_match("/time/",$k) && $value!='None') ? date(DATE_FORMAT,$value) : htmlspecialchars($value, ENT_QUOTES, 'UTF-8'),"</td>", 995 "</tr>"; 996 $m=1-$m; 997 } 998 if($fieldkey=='info') { 999 echo "<tr class=tr-$m><td class=td-0>Stored Value</td><td class=td-last><pre>"; 1000 $output = var_export(apc_fetch($entry[$fieldkey]),true); 1001 echo htmlspecialchars($output, ENT_QUOTES, 'UTF-8'); 1002 echo "</pre></td></tr>\n"; 1003 } 1004 break; 1005 } 1006 } 1007 1008 echo <<<EOB 1009 </tbody></table> 1010 </div> 1011 EOB; 1012 break; 1013 } 1014 1015 $cols=6; 1016 echo <<<EOB 1017 <div class=sorting><form>Scope: 1018 <input type=hidden name=OB value={$MYREQUEST['OB']}> 1019 <select name=SCOPE> 1020 EOB; 1021 echo 1022 "<option value=A",$MYREQUEST['SCOPE']=='A' ? " selected":"",">Active</option>", 1023 "<option value=D",$MYREQUEST['SCOPE']=='D' ? " selected":"",">Deleted</option>", 1024 "</select>", 1025 ", Sorting:<select name=SORT1>", 1026 "<option value=H",$MYREQUEST['SORT1']=='H' ? " selected":"",">Hits</option>", 1027 "<option value=Z",$MYREQUEST['SORT1']=='Z' ? " selected":"",">Size</option>", 1028 "<option value=S",$MYREQUEST['SORT1']=='S' ? " selected":"",">$fieldheading</option>", 1029 "<option value=A",$MYREQUEST['SORT1']=='A' ? " selected":"",">Last accessed</option>", 1030 "<option value=M",$MYREQUEST['SORT1']=='M' ? " selected":"",">Last modified</option>", 1031 "<option value=C",$MYREQUEST['SORT1']=='C' ? " selected":"",">Created at</option>", 1032 "<option value=D",$MYREQUEST['SORT1']=='D' ? " selected":"",">Deleted at</option>"; 1033 if($fieldname=='info') echo 1034 "<option value=D",$MYREQUEST['SORT1']=='T' ? " selected":"",">Timeout</option>"; 1035 echo 1036 '</select>', 1037 '<select name=SORT2>', 1038 '<option value=D',$MYREQUEST['SORT2']=='D' ? ' selected':'','>DESC</option>', 1039 '<option value=A',$MYREQUEST['SORT2']=='A' ? ' selected':'','>ASC</option>', 1040 '</select>', 1041 '<select name=COUNT onChange="form.submit()">', 1042 '<option value=10 ',$MYREQUEST['COUNT']=='10' ? ' selected':'','>Top 10</option>', 1043 '<option value=20 ',$MYREQUEST['COUNT']=='20' ? ' selected':'','>Top 20</option>', 1044 '<option value=50 ',$MYREQUEST['COUNT']=='50' ? ' selected':'','>Top 50</option>', 1045 '<option value=100',$MYREQUEST['COUNT']=='100'? ' selected':'','>Top 100</option>', 1046 '<option value=150',$MYREQUEST['COUNT']=='150'? ' selected':'','>Top 150</option>', 1047 '<option value=200',$MYREQUEST['COUNT']=='200'? ' selected':'','>Top 200</option>', 1048 '<option value=500',$MYREQUEST['COUNT']=='500'? ' selected':'','>Top 500</option>', 1049 '<option value=0 ',$MYREQUEST['COUNT']=='0' ? ' selected':'','>All</option>', 1050 '</select>', 1051 ' Search: <input name=SEARCH value="',$MYREQUEST['SEARCH'],'" type=text size=25/>', 1052 ' <input type=submit value="GO!">', 1053 '</form></div>'; 1054 1055 if (isset($MYREQUEST['SEARCH'])) { 1056 // Don't use preg_quote because we want the user to be able to specify a 1057 // regular expression subpattern. 1058 $MYREQUEST['SEARCH'] = '/'.str_replace('/', '\\/', $MYREQUEST['SEARCH']).'/i'; 1059 if (preg_match($MYREQUEST['SEARCH'], 'test') === false) { 1060 echo '<div class="error">Error: enter a valid regular expression as a search query.</div>'; 1061 break; 1062 } 1063 } 1064 1065 echo 1066 '<div class="info"><table cellspacing=0><tbody>', 1067 '<tr>', 1068 '<th>',sortheader('S',$fieldheading, "&OB=".$MYREQUEST['OB']),'</th>', 1069 '<th>',sortheader('H','Hits', "&OB=".$MYREQUEST['OB']),'</th>', 1070 '<th>',sortheader('Z','Size', "&OB=".$MYREQUEST['OB']),'</th>', 1071 '<th>',sortheader('A','Last accessed',"&OB=".$MYREQUEST['OB']),'</th>', 1072 '<th>',sortheader('M','Last modified',"&OB=".$MYREQUEST['OB']),'</th>', 1073 '<th>',sortheader('C','Created at', "&OB=".$MYREQUEST['OB']),'</th>'; 1074 1075 if($fieldname=='info') { 1076 $cols+=2; 1077 echo '<th>',sortheader('T','Timeout',"&OB=".$MYREQUEST['OB']),'</th>'; 1078 } 1079 echo '<th>',sortheader('D','Deleted at',"&OB=".$MYREQUEST['OB']),'</th></tr>'; 1080 1081 // builds list with alpha numeric sortable keys 1082 // 1083 $list = array(); 1084 foreach($cache[$scope_list[$MYREQUEST['SCOPE']]] as $i => $entry) { 1085 switch($MYREQUEST['SORT1']) { 1086 case 'A': $k=sprintf('%015d-',$entry['access_time']); break; 1087 case 'H': $k=sprintf('%015d-',$entry['num_hits']); break; 1088 case 'Z': $k=sprintf('%015d-',$entry['mem_size']); break; 1089 case 'M': $k=sprintf('%015d-',$entry['mtime']); break; 1090 case 'C': $k=sprintf('%015d-',$entry['creation_time']); break; 1091 case 'T': $k=sprintf('%015d-',$entry['ttl']); break; 1092 case 'D': $k=sprintf('%015d-',$entry['deletion_time']); break; 1093 case 'S': $k=''; break; 1094 } 1095 if (!$AUTHENTICATED) { 1096 // hide all path entries if not logged in 1097 $list[$k.$entry[$fieldname]]=preg_replace('/^.*(\\/|\\\\)/','*hidden*/',$entry); 1098 } else { 1099 $list[$k.$entry[$fieldname]]=$entry; 1100 } 1101 } 1102 1103 if ($list) { 1104 1105 // sort list 1106 // 1107 switch ($MYREQUEST['SORT2']) { 1108 case "A": krsort($list); break; 1109 case "D": ksort($list); break; 1110 } 1111 1112 // output list 1113 $i=0; 1114 foreach($list as $k => $entry) { 1115 if(!$MYREQUEST['SEARCH'] || preg_match($MYREQUEST['SEARCH'], $entry[$fieldname]) != 0) { 1116 $field_value = htmlentities(strip_tags($entry[$fieldname],''), ENT_QUOTES, 'UTF-8'); 1117 echo 1118 '<tr class=tr-',$i%2,'>', 1119 "<td class=td-0><a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&SH=",md5($entry[$fieldkey]),"\">",$field_value,'</a></td>', 1120 '<td class="td-n center">',$entry['num_hits'],'</td>', 1121 '<td class="td-n right">',$entry['mem_size'],'</td>', 1122 '<td class="td-n center">',date(DATE_FORMAT,$entry['access_time']),'</td>', 1123 '<td class="td-n center">',date(DATE_FORMAT,$entry['mtime']),'</td>', 1124 '<td class="td-n center">',date(DATE_FORMAT,$entry['creation_time']),'</td>'; 1125 1126 if($fieldname=='info') { 1127 if($entry['ttl']) 1128 echo '<td class="td-n center">'.$entry['ttl'].' seconds</td>'; 1129 else 1130 echo '<td class="td-n center">None</td>'; 1131 } 1132 if ($entry['deletion_time']) { 1133 1134 echo '<td class="td-last center">', date(DATE_FORMAT,$entry['deletion_time']), '</td>'; 1135 } else if ($MYREQUEST['OB'] == OB_USER_CACHE) { 1136 1137 echo '<td class="td-last center">'; 1138 echo '[<a href="', $MY_SELF, '&OB=', $MYREQUEST['OB'], '&DU=', urlencode($entry[$fieldkey]), '">Delete Now</a>]'; 1139 echo '</td>'; 1140 } else { 1141 echo '<td class="td-last center"> </td>'; 1142 } 1143 echo '</tr>'; 1144 $i++; 1145 if ($i == $MYREQUEST['COUNT']) 1146 break; 1147 } 1148 } 1149 1150 } else { 1151 echo '<tr class=tr-0><td class="center" colspan=',$cols,'><i>No data</i></td></tr>'; 1152 } 1153 echo <<< EOB 1154 </tbody></table> 1155 EOB; 1156 1157 if ($list && $i < count($list)) { 1158 echo "<a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&COUNT=0\"><i>",count($list)-$i,' more available...</i></a>'; 1159 } 1160 1161 echo <<< EOB 1162 </div> 1163 EOB; 1164 break; 1165 1166 1167 // ----------------------------------------------- 1168 // Per-Directory System Cache Entries 1169 // ----------------------------------------------- 1170 case OB_SYS_CACHE_DIR: 1171 if (!$AUTHENTICATED) { 1172 break; 1173 } 1174 1175 echo <<<EOB 1176 <div class=sorting><form>Scope: 1177 <input type=hidden name=OB value={$MYREQUEST['OB']}> 1178 <select name=SCOPE> 1179 EOB; 1180 echo 1181 "<option value=A",$MYREQUEST['SCOPE']=='A' ? " selected":"",">Active</option>", 1182 "<option value=D",$MYREQUEST['SCOPE']=='D' ? " selected":"",">Deleted</option>", 1183 "</select>", 1184 ", Sorting:<select name=SORT1>", 1185 "<option value=H",$MYREQUEST['SORT1']=='H' ? " selected":"",">Total Hits</option>", 1186 "<option value=Z",$MYREQUEST['SORT1']=='Z' ? " selected":"",">Total Size</option>", 1187 "<option value=T",$MYREQUEST['SORT1']=='T' ? " selected":"",">Number of Files</option>", 1188 "<option value=S",$MYREQUEST['SORT1']=='S' ? " selected":"",">Directory Name</option>", 1189 "<option value=A",$MYREQUEST['SORT1']=='A' ? " selected":"",">Avg. Size</option>", 1190 "<option value=C",$MYREQUEST['SORT1']=='C' ? " selected":"",">Avg. Hits</option>", 1191 '</select>', 1192 '<select name=SORT2>', 1193 '<option value=D',$MYREQUEST['SORT2']=='D' ? ' selected':'','>DESC</option>', 1194 '<option value=A',$MYREQUEST['SORT2']=='A' ? ' selected':'','>ASC</option>', 1195 '</select>', 1196 '<select name=COUNT onChange="form.submit()">', 1197 '<option value=10 ',$MYREQUEST['COUNT']=='10' ? ' selected':'','>Top 10</option>', 1198 '<option value=20 ',$MYREQUEST['COUNT']=='20' ? ' selected':'','>Top 20</option>', 1199 '<option value=50 ',$MYREQUEST['COUNT']=='50' ? ' selected':'','>Top 50</option>', 1200 '<option value=100',$MYREQUEST['COUNT']=='100'? ' selected':'','>Top 100</option>', 1201 '<option value=150',$MYREQUEST['COUNT']=='150'? ' selected':'','>Top 150</option>', 1202 '<option value=200',$MYREQUEST['COUNT']=='200'? ' selected':'','>Top 200</option>', 1203 '<option value=500',$MYREQUEST['COUNT']=='500'? ' selected':'','>Top 500</option>', 1204 '<option value=0 ',$MYREQUEST['COUNT']=='0' ? ' selected':'','>All</option>', 1205 '</select>', 1206 ", Group By Dir Level:<select name=AGGR>", 1207 "<option value='' selected>None</option>"; 1208 for ($i = 1; $i < 10; $i++) 1209 echo "<option value=$i",$MYREQUEST['AGGR']==$i ? " selected":"",">$i</option>"; 1210 echo '</select>', 1211 ' <input type=submit value="GO!">', 1212 '</form></div>', 1213 1214 '<div class="info"><table cellspacing=0><tbody>', 1215 '<tr>', 1216 '<th>',sortheader('S','Directory Name', "&OB=".$MYREQUEST['OB']),'</th>', 1217 '<th>',sortheader('T','Number of Files',"&OB=".$MYREQUEST['OB']),'</th>', 1218 '<th>',sortheader('H','Total Hits', "&OB=".$MYREQUEST['OB']),'</th>', 1219 '<th>',sortheader('Z','Total Size', "&OB=".$MYREQUEST['OB']),'</th>', 1220 '<th>',sortheader('C','Avg. Hits', "&OB=".$MYREQUEST['OB']),'</th>', 1221 '<th>',sortheader('A','Avg. Size', "&OB=".$MYREQUEST['OB']),'</th>', 1222 '</tr>'; 1223 1224 // builds list with alpha numeric sortable keys 1225 // 1226 $tmp = $list = array(); 1227 foreach($cache[$scope_list[$MYREQUEST['SCOPE']]] as $entry) { 1228 $n = dirname($entry['filename']); 1229 if ($MYREQUEST['AGGR'] > 0) { 1230 $n = preg_replace("!^(/?(?:[^/\\\\]+[/\\\\]){".($MYREQUEST['AGGR']-1)."}[^/\\\\]*).*!", "$1", $n); 1231 } 1232 if (!isset($tmp[$n])) { 1233 $tmp[$n] = array('hits'=>0,'size'=>0,'ents'=>0); 1234 } 1235 $tmp[$n]['hits'] += $entry['num_hits']; 1236 $tmp[$n]['size'] += $entry['mem_size']; 1237 ++$tmp[$n]['ents']; 1238 } 1239 1240 foreach ($tmp as $k => $v) { 1241 switch($MYREQUEST['SORT1']) { 1242 case 'A': $kn=sprintf('%015d-',$v['size'] / $v['ents']);break; 1243 case 'T': $kn=sprintf('%015d-',$v['ents']); break; 1244 case 'H': $kn=sprintf('%015d-',$v['hits']); break; 1245 case 'Z': $kn=sprintf('%015d-',$v['size']); break; 1246 case 'C': $kn=sprintf('%015d-',$v['hits'] / $v['ents']);break; 1247 case 'S': $kn = $k; break; 1248 } 1249 $list[$kn.$k] = array($k, $v['ents'], $v['hits'], $v['size']); 1250 } 1251 1252 if ($list) { 1253 1254 // sort list 1255 // 1256 switch ($MYREQUEST['SORT2']) { 1257 case "A": krsort($list); break; 1258 case "D": ksort($list); break; 1259 } 1260 1261 // output list 1262 $i = 0; 1263 foreach($list as $entry) { 1264 echo 1265 '<tr class=tr-',$i%2,'>', 1266 "<td class=td-0>",$entry[0],'</a></td>', 1267 '<td class="td-n center">',$entry[1],'</td>', 1268 '<td class="td-n center">',$entry[2],'</td>', 1269 '<td class="td-n center">',$entry[3],'</td>', 1270 '<td class="td-n center">',round($entry[2] / $entry[1]),'</td>', 1271 '<td class="td-n center">',round($entry[3] / $entry[1]),'</td>', 1272 '</tr>'; 1273 1274 if (++$i == $MYREQUEST['COUNT']) break; 1275 } 1276 1277 } else { 1278 echo '<tr class=tr-0><td class="center" colspan=6><i>No data</i></td></tr>'; 1279 } 1280 echo <<< EOB 1281 </tbody></table> 1282 EOB; 1283 1284 if ($list && $i < count($list)) { 1285 echo "<a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&COUNT=0\"><i>",count($list)-$i,' more available...</i></a>'; 1286 } 1287 1288 echo <<< EOB 1289 </div> 1290 EOB; 1291 break; 1292 1293 // ----------------------------------------------- 1294 // Version check 1295 // ----------------------------------------------- 1296 case OB_VERSION_CHECK: 1297 echo <<<EOB 1298 <div class="info"><h2>APC Version Information</h2> 1299 <table cellspacing=0><tbody> 1300 <tr> 1301 <th></th> 1302 </tr> 1303 EOB; 1304 if (defined('PROXY')) { 1305 $ctxt = stream_context_create( array( 'http' => array( 'proxy' => PROXY, 'request_fulluri' => True ) ) ); 1306 $rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apc.rss", False, $ctxt); 1307 } else { 1308 $rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apc.rss"); 1309 } 1310 if (!$rss) { 1311 echo '<tr class="td-last center"><td>Unable to fetch version information.</td></tr>'; 1312 } else { 1313 $apcversion = phpversion('apc'); 1314 1315 preg_match('!<title>APC ([0-9.]+)</title>!', $rss, $match); 1316 echo '<tr class="tr-0 center"><td>'; 1317 if (version_compare($apcversion, $match[1], '>=')) { 1318 echo '<div class="ok">You are running the latest version of APC ('.$apcversion.')</div>'; 1319 $i = 3; 1320 } else { 1321 echo '<div class="failed">You are running an older version of APC ('.$apcversion.'), 1322 newer version '.$match[1].' is available at <a href="http://pecl.php.net/package/APC/'.$match[1].'"> 1323 http://pecl.php.net/package/APC/'.$match[1].'</a> 1324 </div>'; 1325 $i = -1; 1326 } 1327 echo '</td></tr>'; 1328 echo '<tr class="tr-0"><td><h3>Change Log:</h3><br/>'; 1329 1330 preg_match_all('!<(title|description)>([^<]+)</\\1>!', $rss, $match); 1331 next($match[2]); next($match[2]); 1332 1333 while (list(,$v) = each($match[2])) { 1334 list(,$ver) = explode(' ', $v, 2); 1335 if ($i < 0 && version_compare($apcversion, $ver, '>=')) { 1336 break; 1337 } else if (!$i--) { 1338 break; 1339 } 1340 echo "<b><a href=\"http://pecl.php.net/package/APC/$ver\">".htmlspecialchars($v, ENT_QUOTES, 'UTF-8')."</a></b><br><blockquote>"; 1341 echo nl2br(htmlspecialchars(current($match[2]), ENT_QUOTES, 'UTF-8'))."</blockquote>"; 1342 next($match[2]); 1343 } 1344 echo '</td></tr>'; 1345 } 1346 echo <<< EOB 1347 </tbody></table> 1348 </div> 1349 EOB; 1350 break; 1351 1352 } 1353 1354 echo <<< EOB 1355 </div> 1356 EOB; 1357 1358 ?> 1359 1360 <!-- <?php echo "\nBased on APCGUI By R.Becker\n$VERSION\n"?> --> 1361 </body> 1362 </html> 1363 1364