-
-
Save jeffery/9681064 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
OCP - Optimizer+ Control Panel, by _ck_ | |
Version 0.0.4 | |
Free for any kind of use or modification, I am not responsible for anything, please share your improvements | |
* revision history | |
0.0.4 2013-02-18 added file grouping and sorting (click on headers) - code needs cleanup but gets the job done | |
0.0.2 2013-02-14 first public release | |
* known problems/limitations: | |
Zend only stores the file last modified timestamp, not when it was first put into the cache | |
There is no way to delete/update individual files in the cache or change any settings on the fly | |
accelerator_reset function doesn't just clear the cache, it restarts the module entirely? | |
* todo: | |
Extract variables for prefered ordering and better layout instead of just dumping into tables | |
CSS graph of memory use, free, wasted, filecount | |
File list filter | |
Sort direction / group level indicators | |
*/ | |
ini_set('display_errors','1'); error_reporting(-1); | |
if ( !empty($_GET['CLEAR']) ) { | |
if ( function_exists('accelerator_reset') ) { accelerator_reset(); } | |
header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) ); | |
exit; | |
} | |
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml"> | |
<head> | |
<title>OCP - Optimizer+ Control Panel</title> | |
<meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /> | |
<style type="text/css"> | |
body {background-color: #fff; color: #000;} | |
body, td, th, h1, h2 {font-family: sans-serif;} | |
pre {margin: 0px; font-family: monospace;} | |
a:link,a:visited {color: #000099; text-decoration: none;} | |
a:hover {text-decoration: underline;} | |
table {border-collapse: collapse;} | |
.center {text-align: center;} | |
.center table { margin-left: auto; margin-right: auto; text-align: left;} | |
.center th { text-align: center !important; } | |
td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline;} | |
h1 {font-size: 150%;} | |
h2 {font-size: 125%;} | |
.p {text-align: left;} | |
.e {background-color: #ccccff; font-weight: bold; color: #000; width:50%; white-space:nowrap;} | |
.h {background-color: #9999cc; font-weight: bold; color: #000;} | |
.v {background-color: #cccccc; color: #000;} | |
.vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;} | |
img {float: right; border: 0px;} | |
hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;} | |
.meta, .small {font-size: 75%; } | |
.meta {margin: 10px;} | |
.meta a, th a {padding: 10px;} | |
.buttons {margin:0 0 15px;} | |
.buttons a {margin:0 15px; background-color: #9999cc; color:#fff; text-decoration:none; padding:0 3px; border:1px solid #000; } | |
</style> | |
</head> | |
<body> | |
<div class="center"> | |
<h1>Optimizer+ Control Panel</h1> | |
<div class="buttons"> | |
<a href="?ALL=1">Detailed</a> | |
<a href="?FILES=1&GROUP=2&SORT=3">Files Cached</a> | |
<a href="?CLEAR=1" onclick="return confirm('RESET cache?')">Clear Cache</a> | |
</div> | |
<div class="meta"> | |
<a href="http://files.zend.com/help/Zend-Server/content/zendoptimizerplus.html">directives guide</a> | | |
<a href="http://files.zend.com/help/Zend-Server/content/zend_optimizer+_-_php_api.htm">functions guide</a> | | |
<a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> | | |
<a href="https://gist.github.com/ck-on/4959032">OCP latest</a> | |
</div> | |
<?php | |
if ( !function_exists('accelerator_get_status') ) { echo '<h2>Optimizer+ not detected?</h2>'; die; } | |
if ( !empty($_GET['FILES']) ) { echo '<h2>files cached</h2>'; files_display(); echo '</div></body></html>'; exit; } | |
ob_start(); phpinfo(8); $phpinfo = ob_get_contents(); ob_end_clean(); // some info is only available via phpinfo? sadly buffering capture has to be used | |
if ( !preg_match( '/module\_Zend Optimizer\+.+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $optimizerplus) ) { } // todo | |
if ( function_exists('accelerator_get_configuration') ) { echo '<h2>general</h2>'; $configuration=accelerator_get_configuration(); } | |
if ( !empty($configuration['version']['version']) ) { | |
$version=array('Version'=>$configuration['version']['accelerator_product_name'].' '.$configuration['version']['version']); | |
print_table($version); | |
} | |
if ( !empty($optimizerplus[1]) ) { echo $optimizerplus[1]; } | |
if ( function_exists('accelerator_get_status') && $status=accelerator_get_status() ) { | |
if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; } | |
echo '<h2>memory</h2>'; | |
print_table($status['memory_usage']); | |
if ( !empty($status['accelerator_statistics']['last_restart_time']) ) { | |
$status['accelerator_statistics']['last_restart']=time_since(time(),$status['accelerator_statistics']['last_restart_time']); | |
unset($status['accelerator_statistics']['last_restart_time']); | |
} | |
echo '<h2>statistics</h2>'; | |
print_table($status['accelerator_statistics']); | |
} | |
if ( empty($_GET['ALL']) ) {exit;} | |
if ( !empty($configuration['blacklist']) ) { echo '<h2>blacklist</h2>'; print_table($configuration['blacklist']); } | |
if ( !empty($optimizerplus[2]) ) { echo '<h2>runtime</h2>'; echo $optimizerplus[2]; } | |
if ( $functions=get_extension_funcs('zend optimizer+') ) { echo '<h2>functions</h2>'; print_table($functions); } | |
echo '</div></body></html>'; | |
exit; | |
function time_since($time,$original) { | |
$text=' ago'; | |
$time = $time - $original; | |
$day = round($time/86400,0); | |
$result = ''; | |
if ( $time < 86400) { | |
if ( $time < 60) { $result = $time.' second'; } | |
elseif ( $time < 3600) { $result = floor($time/60).' minute'; } | |
else { $result = floor($time/3600).' hour'; } | |
} | |
elseif ( $day < 14) { $result = $day.' day'; } | |
elseif ( $day < 56) { $result = floor($day/7).' week'; } | |
elseif ( $day < 672) { $result = floor($day/28).' month'; } | |
else { $result = (intval(2*($day/365))/2).' year'; } | |
if ( intval($result)!=1) {$result.='s';} | |
return $result.$text; | |
} | |
function print_table($array) { | |
if ( empty($array) || !is_array($array) ) {return;} | |
echo '<table border="0" cellpadding="3" width="600">'; | |
foreach ($array as $key=>$value) { | |
echo '<tr>'; | |
if ( !is_numeric($key) ) { | |
$key=ucwords(str_replace('_',' ',$key)); | |
echo '<td class="e">',$key,'</td>'; | |
if ( is_numeric($value) ) { | |
if ( $value>1048576) { $value=round($value/1048576,1).'M'; } | |
elseif ( is_float($value) ) { $value=round($value,1); } | |
} | |
} | |
if ( is_array($value) ) { | |
foreach ($value as $column) { | |
echo '<td class="v">',$column,'</td>'; | |
} | |
echo '</tr>'; | |
} | |
else { echo '<td class="v">',$value,'</td></tr>'; } | |
} | |
echo '</table>'; | |
} | |
function files_display() { | |
$status=accelerator_get_status(); | |
if ( empty($status['scripts']) ) {return;} | |
$time=time(); $sort=0; $group=0; | |
$nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']); | |
$nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']); | |
echo '<div class="meta"> | |
<a href="',$nogroup,'">ungroup</a> | | |
<a href="',$nogroup,'&GROUP=1">1</a> | | |
<a href="',$nogroup,'&GROUP=2">2</a> | | |
<a href="',$nogroup,'&GROUP=3">3</a> | | |
<a href="',$nogroup,'&GROUP=4">4</a> | | |
<a href="',$nogroup,'&GROUP=5">5</a> | |
</div>'; | |
if ( empty($_GET['GROUP']) ) { $files =& $status['scripts']; } | |
else { | |
$group=intval($_GET['GROUP']); | |
if ( $group<1 || $group>9) { $group=1;} | |
$files=array(); | |
foreach ($status['scripts'] as $data) { | |
if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) { | |
if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); } | |
$files[$path[0]]['full_path']=$path[0]; | |
$files[$path[0]]['files']++; | |
$files[$path[0]]['memory_consumption']+=$data['memory_consumption']; | |
$files[$path[0]]['hits']+=$data['hits']; | |
if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];} | |
if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];} | |
} | |
} | |
} | |
if ( !empty($_GET['SORT']) ) { | |
$keys=array( | |
'full_path'=>SORT_STRING, | |
'files'=>SORT_NUMERIC, | |
'memory_consumption'=>SORT_NUMERIC, | |
'hits'=>SORT_NUMERIC, | |
'last_used_timestamp'=>SORT_NUMERIC, | |
'timestamp'=>SORT_NUMERIC | |
); | |
$offsets=array_keys($keys); | |
$key=intval($_GET['SORT']); | |
$direction=$key>0?1:-1; | |
$key=abs($key)-1; | |
$key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets); | |
$sort=array_search($key,$offsets)+1; | |
if ( $keys[$key]==SORT_STRING) {$direction=-$direction;} | |
$direction=$direction>0?SORT_DESC:SORT_ASC; | |
$column=array(); | |
foreach ($files as $data) { $column[]=$data[$key]; } | |
array_multisort($column, $keys[$key], $direction, $files); | |
} | |
echo '<table border="0" cellpadding="3" width="960"> | |
<tr class="h"> | |
<th><a href="',$nosort,'&SORT=',($sort==1?-1:1),'">script</a></th> | |
'.(empty($group)?'':'<th><a href="'.$nosort.'&SORT='.($sort==2?-2:2).'">files</a></th>').' | |
<th><a href="',$nosort,'&SORT=',($sort==3?-3:3),'">size</a></th> | |
<th><a href="',$nosort,'&SORT=',($sort==4?-4:4),'">hits</a></th> | |
<th><a href="',$nosort,'&SORT=',($sort==5?-5:5),'">last used</a></th> | |
<th><a href="',$nosort,'&SORT=',($sort==6?-6:6),'">created</a></th> | |
</tr>'; | |
foreach ($files as $data) { | |
echo '<tr> | |
<td class="v" nowrap>',$data['full_path'],'</td>', | |
(empty($group)?'':'<td class="vr">'.$data['files'].'</td>'), | |
'<td class="vr">',round($data['memory_consumption']/1024),'K</td>', | |
'<td class="vr">',$data['hits'],'</td>', | |
'<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>', | |
'<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td> | |
</tr>'; | |
} | |
echo '</table>'; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment