Gentics Portal.Node PHP API
 All Classes Namespaces Functions Variables Pages
apc.php
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: apc.php 307048 2011-01-03 23:53:17Z kalle $';
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',1); // 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','apc'); // Admin Username
42 defaults('ADMIN_PASSWORD','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', 'Y/m/d H:i:s'); // US
49 
50 defaults('GRAPH_SIZE',200); // 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/>&nbsp;<br/>&nbsp;
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 avaliable
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']}'&nbsp;logged&nbsp;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 &amp; 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">&nbsp;</span>Free: ',bsize($mem_avail).sprintf(" (%.1f%%)",$mem_avail*100/$mem_size),"</td>\n",
878  '<td class=td-1><span class="green box">&nbsp;</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">&nbsp;</span>Used: ',bsize($mem_used ).sprintf(" (%.1f%%)",$mem_used *100/$mem_size),"</td>\n",
882  '<td class=td-1><span class="red box">&nbsp;</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/>&nbsp;<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>&lt;hidden&gt;</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  '&nbsp; Search: <input name=SEARCH value="',$MYREQUEST['SEARCH'],'" type=text size=25/>',
1052  '&nbsp;<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"> &nbsp; </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  '&nbsp;<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>