Skip to content

Instantly share code, notes, and snippets.

@nyufeng
Forked from ck-on/ocp.php
Created May 26, 2022 08:01

Revisions

  1. nyufeng revised this gist May 26, 2022. 1 changed file with 6 additions and 0 deletions.
    6 changes: 6 additions & 0 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -162,6 +162,12 @@
    unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
    echo '<h2 id="statistics">statistics</h2>';
    print_table($status[CACHEPREFIX.'statistics']);
    echo '<h2 id="strings">interned strings usage</h2>';
    print_table($status['interned_strings_usage']);
    if(isset($status['jit'])){
    echo '<h2 id="strings">JIT</h2>';
    print_table($status['jit']);
    }
    }

    if ( empty($_GET['ALL']) ) { meta_display(); exit; }
  2. @ck-on ck-on revised this gist Sep 1, 2015. 1 changed file with 3 additions and 2 deletions.
    5 changes: 3 additions & 2 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -2,10 +2,11 @@
    /*
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_ (with contributions by GK, stasilok)
    Version: 0.1.6
    Version: 0.1.7
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.7 2015-09-01 regex fix for PHP7 phpinfo
    0.1.6 2013-04-12 moved meta to footer so graphs can be higher and reduce clutter
    0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
    0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
    @@ -132,7 +133,7 @@
    if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { 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\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $opcache) ) { } // todo
    if ( !preg_match( '/module\_Zend.(Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/is', $phpinfo, $opcache) ) { } // todo

    if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); }

  3. @ck-on ck-on revised this gist May 31, 2014. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -67,12 +67,12 @@
    pre {margin: 0px; font-family: monospace;}
    a:link,a:visited {color: #000099; text-decoration: none;}
    a:hover {text-decoration: underline;}
    table {border-collapse: collapse;}
    table {border-collapse: collapse; width: 600px; }
    .center {text-align: center;}
    .center table { margin-left: auto; margin-right: auto; text-align: left;}
    .center th { text-align: center !important; }
    .middle {vertical-align:middle;}
    td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline;}
    td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline; padding: 3px; }
    h1 {font-size: 150%;}
    h2 {font-size: 125%;}
    .p {text-align: left;}
  4. @ck-on ck-on revised this gist Apr 14, 2013. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -22,6 +22,7 @@
    Unlike APC, the Zend OPcache API
    - cannot determine when a file was put into the cache
    - cannot change settings on the fly
    - cannot protect opcache functions by restricting execution to only specific scripts/paths
    * todo:
    Extract variables for prefered ordering and better layout instead of just dumping into tables
  5. @ck-on ck-on revised this gist Apr 12, 2013. 1 changed file with 20 additions and 13 deletions.
    33 changes: 20 additions & 13 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -2,10 +2,11 @@
    /*
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_ (with contributions by GK, stasilok)
    Version: 0.1.5
    Version: 0.1.6
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.6 2013-04-12 moved meta to footer so graphs can be higher and reduce clutter
    0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
    0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
    0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
    @@ -83,13 +84,13 @@
    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 {margin: 2em 0;}
    .meta a, th a {padding: 10px; white-space:nowrap; }
    .buttons {margin:0 0 20px;}
    .buttons {margin:0 0 1em;}
    .buttons a {margin:0 15px; background-color: #9999cc; color:#fff; text-decoration:none; padding:1px; border:1px solid #000; display:inline-block; width:5em; text-align:center;}
    #files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
    #files td.v a:hover {font-weight:bold; color:#ee0000;}
    .graph {display:inline-block; width:145px; margin:1em 0 0 1px; border:0; vertical-align:top;}
    .graph {display:inline-block; width:145px; margin:1em 0 1em 1px; border:0; vertical-align:top;}
    .graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
    .graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
    .graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
    @@ -121,13 +122,6 @@
    <a href="?" onclick="window.location.reload(true); return false">Refresh</a>
    </div>

    <div class="meta">
    <a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
    <a href="http://files.zend.com/help/Zend-Server-6/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.php">OCP latest</a>
    </div>

    <?php

    if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; }
    @@ -168,7 +162,7 @@
    print_table($status[CACHEPREFIX.'statistics']);
    }

    if ( empty($_GET['ALL']) ) {exit;}
    if ( empty($_GET['ALL']) ) { meta_display(); exit; }

    if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); }

    @@ -205,6 +199,8 @@
    exit;
    }

    meta_display();

    echo '</div></body></html>';

    exit;
    @@ -338,7 +334,6 @@ function files_display() {
    }

    function graphs_display() {

    $graphs=array();
    $colors=array('green','brown','red');
    $primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
    @@ -380,3 +375,15 @@ function graphs_display() {
    }
    }

    function meta_display() {
    ?>
    <div class="meta">
    <a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
    <a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
    <a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
    <a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
    <a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
    <a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
    </div>
    <?php
    }
  6. @ck-on ck-on revised this gist Apr 12, 2013. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion ocp.php
    Original file line number Diff line number Diff line change
    @@ -364,7 +364,7 @@ function graphs_display() {

    $graphs['restarts']['total']=0;
    $graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
    $graphs['restarts']['hash']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
    $graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
    $graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
    $graphs['restarts']['total']=array_sum($graphs['restarts']);

  7. @ck-on ck-on revised this gist Apr 12, 2013. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion ocp.php
    Original file line number Diff line number Diff line change
    @@ -2,7 +2,7 @@
    /*
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_ (with contributions by GK, stasilok)
    Version: 0.1.4
    Version: 0.1.5
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
  8. @ck-on ck-on revised this gist Apr 12, 2013. 1 changed file with 73 additions and 10 deletions.
    83 changes: 73 additions & 10 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -6,6 +6,7 @@
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
    0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
    0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
    0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
    @@ -23,7 +24,6 @@
    * 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
    */
    @@ -53,8 +53,8 @@
    exit;
    }

    ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    ?><!DOCTYPE html>
    <html>
    <head>
    <title>OCP - Opcache Control Panel</title>
    <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />
    @@ -89,7 +89,21 @@
    .buttons a {margin:0 15px; background-color: #9999cc; color:#fff; text-decoration:none; padding:1px; border:1px solid #000; display:inline-block; width:5em; text-align:center;}
    #files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
    #files td.v a:hover {font-weight:bold; color:#ee0000;}
    .graph {display:inline-block; width:145px; margin:1em 0 0 1px; border:0; vertical-align:top;}
    .graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
    .graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
    .graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
    .graph .total {width:34px; text-align:center; padding:0 5px 0 0;}
    .graph .total div {border:1px dashed #888; border-right:0; height:99%; width:12px; position:absolute; bottom:0; left:17px; z-index:-1;}
    .graph .total span {background:#fff; font-weight:bold;}
    .graph .actual {text-align:right; font-weight:bold; padding:0 5px 0 0;}
    .graph .red {background:#ee0000;}
    .graph .green {background:#00cc00;}
    .graph .brown {background:#8B4513;}
    </style>
    <!--[if lt IE 9]><script type="text/javascript" defer="defer">
    window.onload=function(){var i,t=document.getElementsByTagName('table');for(i=0;i<t.length;i++){if(t[i].parentNode.className=='graph')t[i].style.height=150-(t[i].clientHeight-150)+'px';}}
    </script><![endif]-->
    </head>

    <body>
    @@ -120,6 +134,8 @@

    if ( !empty($_GET['FILES']) ) { echo '<h2>files cached</h2>'; files_display(); echo '</div></body></html>'; exit; }

    if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { 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\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $opcache) ) { } // todo

    @@ -134,16 +150,19 @@
    if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); }

    if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) {
    if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; }
    echo '<h2 id="memory">memory</h2>';
    print_table($status['memory_usage']);

    $uptime=array();
    if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
    $status[CACHEPREFIX.'statistics']['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
    $uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
    }
    if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
    $status[CACHEPREFIX.'statistics']['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
    $uptime['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
    }
    if (!empty($uptime)) {print_table($uptime);}

    if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; }

    echo '<h2 id="memory">memory</h2>';
    print_table($status['memory_usage']);
    unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
    echo '<h2 id="statistics">statistics</h2>';
    print_table($status[CACHEPREFIX.'statistics']);
    @@ -181,7 +200,7 @@
    }

    if ( isset($_GET['DUMP']) ) {
    if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all ($name,true)); }
    if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); }
    foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
    exit;
    }
    @@ -317,3 +336,47 @@ function files_display() {
    }
    echo '</table>';
    }

    function graphs_display() {

    $graphs=array();
    $colors=array('green','brown','red');
    $primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
    $configuration=call_user_func(CACHEPREFIX.'get_configuration');
    $status=call_user_func(CACHEPREFIX.'get_status');

    $graphs['memory']['total']=$configuration['directives']['opcache.memory_consumption'];
    $graphs['memory']['free']=$status['memory_usage']['free_memory'];
    $graphs['memory']['used']=$status['memory_usage']['used_memory'];
    $graphs['memory']['wasted']=$status['memory_usage']['wasted_memory'];

    $graphs['keys']['total']=$status[CACHEPREFIX.'statistics']['max_cached_keys'];
    foreach ($primes as $prime) { if ($prime>=$graphs['keys']['total']) { $graphs['keys']['total']=$prime; break;} }
    $graphs['keys']['free']=$graphs['keys']['total']-$status[CACHEPREFIX.'statistics']['num_cached_keys'];
    $graphs['keys']['scripts']=$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
    $graphs['keys']['wasted']=$status[CACHEPREFIX.'statistics']['num_cached_keys']-$status[CACHEPREFIX.'statistics']['num_cached_scripts'];

    $graphs['hits']['total']=0;
    $graphs['hits']['hits']=$status[CACHEPREFIX.'statistics']['hits'];
    $graphs['hits']['misses']=$status[CACHEPREFIX.'statistics']['misses'];
    $graphs['hits']['blacklist']=$status[CACHEPREFIX.'statistics']['blacklist_misses'];
    $graphs['hits']['total']=array_sum($graphs['hits']);

    $graphs['restarts']['total']=0;
    $graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
    $graphs['restarts']['hash']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
    $graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
    $graphs['restarts']['total']=array_sum($graphs['restarts']);

    foreach ( $graphs as $caption=>$graph) {
    echo '<div class="graph"><div class="h">',$caption,'</div><table border="0" cellpadding="0" cellspacing="0">';
    foreach ($graph as $label=>$value) {
    if ($label=='total') { $key=0; $total=$value; $totaldisplay='<td rowspan="3" class="total"><span>'.($total>999999?round($total/1024/1024).'M':($total>9999?round($total/1024).'K':$total)).'</span><div></div></td>'; continue;}
    $percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%';
    echo '<tr>',$totaldisplay,'<td class="actual">', ($value>999999?round($value/1024/1024).'M':($value>9999?round($value/1024).'K':$value)),'</td><td class="bar ',$colors[$key],'" height="',$percent,'">',$percent,'</td><td>',$label,'</td></tr>';
    $key++; $totaldisplay='';
    }
    echo '</table></div>',"\n";
    }
    }

  9. @ck-on ck-on revised this gist Apr 9, 2013. 1 changed file with 31 additions and 11 deletions.
    42 changes: 31 additions & 11 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -1,11 +1,12 @@
    <?php
    /*
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_, GK, stasilok
    Version: 0.1.3
    Author: _ck_ (with contributions by GK, stasilok)
    Version: 0.1.4
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
    0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
    0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
    0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
    @@ -17,9 +18,8 @@
    * known problems/limitations:
    Unlike APC, the Zend OPcache API
    - cannot delete/update individual files in the cache manually
    - cannot determine when a file was first put into the cache
    - cannot change any settings on the fly
    - cannot determine when a file was put into the cache
    - cannot change settings on the fly
    * todo:
    Extract variables for prefered ordering and better layout instead of just dumping into tables
    @@ -28,16 +28,31 @@
    */

    // ini_set('display_errors','1'); error_reporting(-1);
    define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));
    // ini_set('display_errors',1); error_reporting(-1);
    if ( count(get_included_files())>1 || php_sapi_name()=='cli' || empty($_SERVER['REMOTE_ADDR']) ) { die; } // weak block against indirect access

    $time=time();
    define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));

    if ( !empty($_GET['CLEAR']) ) {
    if ( !empty($_GET['RESET']) ) {
    if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); }
    header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
    exit;
    }

    if ( !empty($_GET['RECHECK']) ) {
    if ( function_exists(CACHEPREFIX.'invalidate') ) {
    $recheck=trim($_GET['RECHECK']); $files=call_user_func(CACHEPREFIX.'get_status');
    if (!empty($files['scripts'])) {
    foreach ($files['scripts'] as $file=>$value) {
    if ( $recheck==='1' || strpos($file,$recheck)===0 ) call_user_func(CACHEPREFIX.'invalidate',$file);
    }
    }
    header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
    } else { echo 'Sorry, this feature requires Zend Opcache newer than April 8th 2013'; }
    exit;
    }

    ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    @@ -72,6 +87,8 @@
    .meta a, th a {padding: 10px; white-space:nowrap; }
    .buttons {margin:0 0 20px;}
    .buttons a {margin:0 15px; background-color: #9999cc; color:#fff; text-decoration:none; padding:1px; border:1px solid #000; display:inline-block; width:5em; text-align:center;}
    #files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
    #files td.v a:hover {font-weight:bold; color:#ee0000;}
    </style>
    </head>

    @@ -83,7 +100,10 @@
    <div class="buttons">
    <a href="?ALL=1">Details</a>
    <a href="?FILES=1&GROUP=2&SORT=3">Files</a>
    <a href="?CLEAR=1" onclick="return confirm('RESET cache?')">Reset</a>
    <a href="?RESET=1" onclick="return confirm('RESET cache ?')">Reset</a>
    <?php if ( function_exists(CACHEPREFIX.'invalidate') ) { ?>
    <a href="?RECHECK=1" onclick="return confirm('Recheck all files in the cache ?')">Recheck</a>
    <?php } ?>
    <a href="?" onclick="window.location.reload(true); return false">Refresh</a>
    </div>

    @@ -279,15 +299,15 @@ function files_display() {
    array_multisort($column, $keys[$key], $direction, $files);
    }

    echo '<table border="0" cellpadding="3" width="960">
    echo '<table border="0" cellpadding="3" width="960" id="files">
    <tr class="h">';
    foreach ($titles as $column=>$title) {
    if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
    }
    echo ' </tr>';
    foreach ($files as $data) {
    echo '<tr>
    <td class="v" nowrap>',$data['full_path'],'</td>',
    <td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>',
    ($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
    '<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
    '<td class="vr">',number_format($data['hits']),'</td>',
  10. @ck-on ck-on revised this gist Mar 30, 2013. 1 changed file with 17 additions and 15 deletions.
    32 changes: 17 additions & 15 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -2,10 +2,11 @@
    /*
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_, GK, stasilok
    Version: 0.1.2
    Version: 0.1.3
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
    0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
    0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
    0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
    @@ -104,16 +105,17 @@

    if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); }

    if ( !empty($configuration['version']['version']) ) {
    $version=array('Version'=>$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version']);
    print_table($version);
    }
    $host=function_exists('gethostname')?@gethostname():@php_uname('n'); if (empty($host)) { $host=empty($_SERVER['SERVER_NAME'])?$_SERVER['HOST_NAME']:$_SERVER['SERVER_NAME']; }
    $version=array('Host'=>$host);
    $version['PHP Version']='PHP '.(defined('PHP_VERSION')?PHP_VERSION:'???').' '.(defined('PHP_SAPI')?PHP_SAPI:'').' '.(defined('PHP_OS')?' '.PHP_OS:'');
    $version['Opcache Version']=empty($configuration['version']['version'])?'???':$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version'];
    print_table($version);

    if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); }

    if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) {
    if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; }
    echo '<h2>memory</h2>';
    echo '<h2 id="memory">memory</h2>';
    print_table($status['memory_usage']);

    if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
    @@ -123,23 +125,23 @@
    $status[CACHEPREFIX.'statistics']['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
    }
    unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
    echo '<h2>statistics</h2>';
    echo '<h2 id="statistics">statistics</h2>';
    print_table($status[CACHEPREFIX.'statistics']);
    }

    if ( empty($_GET['ALL']) ) {exit;}

    if ( !empty($configuration['blacklist']) ) { echo '<h2>blacklist</h2>'; print_table($configuration['blacklist']); }
    if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); }

    if ( !empty($opcache[3]) ) { echo '<h2>runtime</h2>'; echo $opcache[3]; }
    if ( !empty($opcache[3]) ) { echo '<h2 id="runtime">runtime</h2>'; echo $opcache[3]; }

    $name='zend opcache'; $functions=get_extension_funcs($name);
    if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); }
    if ($functions) { echo '<h2>functions</h2>'; print_table($functions); } else { $name=''; }
    if ($functions) { echo '<h2 id="functions">functions</h2>'; print_table($functions); } else { $name=''; }

    $level=trim(CACHEPREFIX,'_').'.optimization_level';
    if (isset($configuration['directives'][$level])) {
    echo '<h2>optimization levels</h2>';
    echo '<h2 id="optimization">optimization levels</h2>';
    $levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
    $levels=array(
    1=>'<a href="http://wikipedia.org/wiki/Common_subexpression_elimination">Constants subexpressions elimination</a> (CSE) true, false, null, etc.<br />Optimize series of ADD_STRING / ADD_CHAR<br />Convert CAST(IS_BOOL,x) into BOOL(x)<br />Convert <a href="http://www.php.net/manual/internals2.opcodes.init-fcall-by-name.php">INIT_FCALL_BY_NAME</a> + <a href="http://www.php.net/manual/internals2.opcodes.do-fcall-by-name.php">DO_FCALL_BY_NAME</a> into <a href="http://www.php.net/manual/internals2.opcodes.do-fcall.php">DO_FCALL</a>',
    @@ -159,7 +161,7 @@
    }

    if ( isset($_GET['DUMP']) ) {
    if ($name) { echo '<h2>ini</h2>'; print_table(ini_get_all ($name,true)); }
    if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all ($name,true)); }
    foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
    exit;
    }
    @@ -173,13 +175,13 @@ function time_since($time,$original,$extended=0,$text='ago') {
    $day = $extended? floor($time/86400) : round($time/86400,0);
    $amount=0; $unit='';
    if ( $time < 86400) {
    if ( $time < 60) { $amount=$time; $unit='second'; }
    if ( $time < 60) { $amount=$time; $unit='second'; }
    elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
    else { $amount=floor($time/3600); $unit='hour'; }
    else { $amount=floor($time/3600); $unit='hour'; }
    }
    elseif ( $day < 14) { $amount=$day; $unit='day'; }
    elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; }
    elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
    elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
    else { $amount=intval(2*($day/365))/2; $unit='year'; }

    if ( $amount!=1) {$unit.='s';}
  11. @ck-on ck-on revised this gist Mar 25, 2013. 1 changed file with 67 additions and 26 deletions.
    93 changes: 67 additions & 26 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -2,10 +2,11 @@
    /*
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_, GK, stasilok
    Version: 0.1.1
    Version: 0.1.2
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
    0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
    0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
    0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
    @@ -16,9 +17,8 @@
    * known problems/limitations:
    Unlike APC, the Zend OPcache API
    - cannot delete/update individual files in the cache manually
    - cannot change any settings on the fly
    - cannot determine when a file was first put into the cache
    - cannot determine how long the cache has been running, only when it was last reset
    - cannot change any settings on the fly
    * todo:
    Extract variables for prefered ordering and better layout instead of just dumping into tables
    @@ -29,6 +29,7 @@

    // ini_set('display_errors','1'); error_reporting(-1);
    define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));
    $time=time();

    if ( !empty($_GET['CLEAR']) ) {
    if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); }
    @@ -52,6 +53,7 @@
    .center {text-align: center;}
    .center table { margin-left: auto; margin-right: auto; text-align: left;}
    .center th { text-align: center !important; }
    .middle {vertical-align:middle;}
    td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline;}
    h1 {font-size: 150%;}
    h2 {font-size: 125%;}
    @@ -61,6 +63,7 @@
    .v {background-color: #cccccc; color: #000;}
    .vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;}
    .b {font-weight:bold;}
    .white, .white a {color:#fff;}
    img {float: right; border: 0px;}
    hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;}
    .meta, .small {font-size: 75%; }
    @@ -113,49 +116,87 @@
    echo '<h2>memory</h2>';
    print_table($status['memory_usage']);

    if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
    $status[CACHEPREFIX.'statistics']['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
    }
    if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
    $status[CACHEPREFIX.'statistics']['last_restart']=time_since(time(),$status[CACHEPREFIX.'statistics']['last_restart_time']);
    $status[CACHEPREFIX.'statistics']['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
    }
    unset($status[CACHEPREFIX.'statistics']['last_restart_time']);
    unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
    echo '<h2>statistics</h2>';
    print_table($status[CACHEPREFIX.'statistics']);
    }

    if ( empty($_GET['ALL']) ) {exit;}

    if ( !empty($configuration['blacklist']) ) { echo '<h2>blacklist</h2>'; print_table($configuration['blacklist']); }

    if ( !empty($opcache[3]) ) { echo '<h2>runtime</h2>'; echo $opcache[3]; }

    $functions=get_extension_funcs('Zend OPcache'); if (!$functions) { $functions=get_extension_funcs('zend optimizer+'); }
    if ($functions) { echo '<h2>functions</h2>'; print_table($functions); }
    $name='zend opcache'; $functions=get_extension_funcs($name);
    if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); }
    if ($functions) { echo '<h2>functions</h2>'; print_table($functions); } else { $name=''; }

    $level=trim(CACHEPREFIX,'_').'.optimization_level';
    if (isset($configuration['directives'][$level])) {
    echo '<h2>optimization levels</h2>';
    $levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
    $levels=array(
    1=>'<a href="http://wikipedia.org/wiki/Common_subexpression_elimination">Constants subexpressions elimination</a> (CSE) true, false, null, etc.<br />Optimize series of ADD_STRING / ADD_CHAR<br />Convert CAST(IS_BOOL,x) into BOOL(x)<br />Convert <a href="http://www.php.net/manual/internals2.opcodes.init-fcall-by-name.php">INIT_FCALL_BY_NAME</a> + <a href="http://www.php.net/manual/internals2.opcodes.do-fcall-by-name.php">DO_FCALL_BY_NAME</a> into <a href="http://www.php.net/manual/internals2.opcodes.do-fcall.php">DO_FCALL</a>',
    2=>'Convert constant operands to expected types<br />Convert conditional <a href="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a> with constant operands<br />Optimize static <a href="http://php.net/manual/internals2.opcodes.brk.php">BRK</a> and <a href="<a href="http://php.net/manual/internals2.opcodes.cont.php">CONT</a>',
    3=>'Convert $a = $a + expr into $a += expr<br />Convert $a++ into ++$a<br />Optimize series of <a href="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a>',
    4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)',
    5=>'Block Optimization - most expensive pass<br />Performs many different optimization patterns based on <a href="http://wikipedia.org/wiki/Control_flow_graph">control flow graph</a> (CFG)',
    9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)',
    10=>'Remove NOPs'
    );
    echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>';
    foreach ($levels as $pass=>$description) {
    $disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':'';
    echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>';
    }
    echo '</table>';
    }

    if ( isset($_GET['DUMP']) ) {
    if ($name) { echo '<h2>ini</h2>'; print_table(ini_get_all ($name,true)); }
    foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
    exit;
    }

    echo '</div></body></html>';

    exit;

    function time_since($time,$original) {
    $text=' ago';
    function time_since($time,$original,$extended=0,$text='ago') {
    $time = $time - $original;
    $day = round($time/86400,0);
    $result = '';
    $day = $extended? floor($time/86400) : round($time/86400,0);
    $amount=0; $unit='';
    if ( $time < 86400) {
    if ( $time < 60) { $result = $time.' second'; }
    elseif ( $time < 3600) { $result = floor($time/60).' minute'; }
    else { $result = floor($time/3600).' hour'; }
    if ( $time < 60) { $amount=$time; $unit='second'; }
    elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
    else { $amount=floor($time/3600); $unit='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;
    elseif ( $day < 14) { $amount=$day; $unit='day'; }
    elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; }
    elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
    else { $amount=intval(2*($day/365))/2; $unit='year'; }

    if ( $amount!=1) {$unit.='s';}
    if ($extended && $time>60) { $text=' and '.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,'').$text; }

    return $amount.' '.$unit.' '.$text;
    }

    function print_table($array) {
    function print_table($array,$headers=false) {
    if ( empty($array) || !is_array($array) ) {return;}
    echo '<table border="0" cellpadding="3" width="600">';
    if (!empty($headers)) {
    if (!is_array($headers)) {$headers=array_keys(reset($array));}
    echo '<tr class="h">';
    foreach ($headers as $value) { echo '<th>',$value,'</th>'; }
    echo '</tr>';
    }
    foreach ($array as $key=>$value) {
    echo '<tr>';
    if ( !is_numeric($key) ) {
    @@ -245,9 +286,9 @@ function files_display() {
    foreach ($files as $data) {
    echo '<tr>
    <td class="v" nowrap>',$data['full_path'],'</td>',
    ($group?'<td class="vr">'.$data['files'].'</td>':''),
    '<td class="vr">',round($data['memory_consumption']/1024),'K</td>',
    '<td class="vr">',$data['hits'],'</td>',
    ($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
    '<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
    '<td class="vr">',number_format($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>';
  12. @ck-on ck-on revised this gist Mar 19, 2013. 1 changed file with 21 additions and 18 deletions.
    39 changes: 21 additions & 18 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -2,18 +2,19 @@
    /*
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_, GK, stasilok
    Version: 0.1.0
    Version: 0.1.1
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
    0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
    0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
    0.0.5 2013-03-10 added refresh button (GK)
    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:
    Unlike APC, the Zend Opcache API
    Unlike APC, the Zend OPcache API
    - cannot delete/update individual files in the cache manually
    - cannot change any settings on the fly
    - cannot determine when a file was first put into the cache
    @@ -27,9 +28,10 @@
    */

    // ini_set('display_errors','1'); error_reporting(-1);
    define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));

    if ( !empty($_GET['CLEAR']) ) {
    if ( function_exists('opcache_reset') ) { opcache_reset(); }
    if ( !empty($_GET['CLEAR']) ) {
    if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); }
    header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
    exit;
    }
    @@ -90,42 +92,43 @@

    <?php

    if ( !function_exists('opcache_get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; }
    if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache 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, $opcache) ) { } // todo
    if ( !preg_match( '/module\_Zend (Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $opcache) ) { } // todo

    if ( function_exists('opcache_get_configuration') ) { echo '<h2>general</h2>'; $configuration=opcache_get_configuration(); }
    if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); }

    if ( !empty($configuration['version']['version']) ) {
    $version=array('Version'=>$configuration['version']['opcache_product_name'].' '.$configuration['version']['version']);
    $version=array('Version'=>$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version']);
    print_table($version);
    }

    if ( !empty($opcache[1]) ) { echo $opcache[1]; }
    if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); }

    if ( function_exists('opcache_get_status') && $status=opcache_get_status() ) {
    if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'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['opcache_statistics']['last_restart_time']) ) {
    $status['opcache_statistics']['last_restart']=time_since(time(),$status['opcache_statistics']['last_restart_time']);
    if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
    $status[CACHEPREFIX.'statistics']['last_restart']=time_since(time(),$status[CACHEPREFIX.'statistics']['last_restart_time']);
    }
    unset($status['opcache_statistics']['last_restart_time']);
    unset($status[CACHEPREFIX.'statistics']['last_restart_time']);
    echo '<h2>statistics</h2>';
    print_table($status['opcache_statistics']);
    print_table($status[CACHEPREFIX.'statistics']);
    }

    if ( empty($_GET['ALL']) ) {exit;}

    if ( !empty($configuration['blacklist']) ) { echo '<h2>blacklist</h2>'; print_table($configuration['blacklist']); }

    if ( !empty($opcache[2]) ) { echo '<h2>runtime</h2>'; echo $opcache[2]; }
    if ( !empty($opcache[3]) ) { echo '<h2>runtime</h2>'; echo $opcache[3]; }

    if ( $functions=get_extension_funcs('zend optimizer+') ) { echo '<h2>functions</h2>'; print_table($functions); }
    $functions=get_extension_funcs('Zend OPcache'); if (!$functions) { $functions=get_extension_funcs('zend optimizer+'); }
    if ($functions) { echo '<h2>functions</h2>'; print_table($functions); }

    echo '</div></body></html>';

    @@ -174,8 +177,8 @@ function print_table($array) {
    echo '</table>';
    }

    function files_display() {
    $status=opcache_get_status();
    function files_display() {
    $status=call_user_func(CACHEPREFIX.'get_status');
    if ( empty($status['scripts']) ) {return;}
    if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
    $time=time(); $sort=0;
  13. @ck-on ck-on revised this gist Mar 17, 2013. 1 changed file with 63 additions and 57 deletions.
    120 changes: 63 additions & 57 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -1,39 +1,43 @@
    <?php
    /*
    OCP - Optimizer+ Control Panel, by _ck_
    Version 0.0.4
    OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
    Author: _ck_, GK, stasilok
    Version: 0.1.0
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    * revision history
    0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
    0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
    0.0.5 2013-03-10 added refresh button (GK)
    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
    There is no way to tell how long cache has been running if it has never been reset
    accelerator_reset function doesn't just clear the cache, it restarts the module entirely?
    Unlike APC, the Zend Opcache API
    - cannot delete/update individual files in the cache manually
    - cannot change any settings on the fly
    - cannot determine when a file was first put into the cache
    - cannot determine how long the cache has been running, only when it was last reset
    * 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(); }
    if ( function_exists('opcache_reset') ) { opcache_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>
    <title>OCP - Opcache Control Panel</title>
    <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />

    <style type="text/css">
    @@ -54,70 +58,72 @@
    .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;}
    .b {font-weight:bold;}
    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; }
    .meta a, th a {padding: 10px; white-space:nowrap; }
    .buttons {margin:0 0 20px;}
    .buttons a {margin:0 15px; background-color: #9999cc; color:#fff; text-decoration:none; padding:1px; border:1px solid #000; display:inline-block; width:5em; text-align:center;}
    </style>
    </head>

    <body>
    <div class="center">

    <h1>Optimizer+ Control Panel</h1>
    <h1><a href="?">Opcache Control Panel</a></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>
    <a href="?ALL=1">Details</a>
    <a href="?FILES=1&GROUP=2&SORT=3">Files</a>
    <a href="?CLEAR=1" onclick="return confirm('RESET cache?')">Reset</a>
    <a href="?" onclick="window.location.reload(true); return false">Refresh</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="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
    <a href="http://files.zend.com/help/Zend-Server-6/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>
    <a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
    </div>

    <?php

    if ( !function_exists('accelerator_get_status') ) { echo '<h2>Optimizer+ not detected?</h2>'; die; }
    if ( !function_exists('opcache_get_status') ) { echo '<h2>Opcache 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 ( !preg_match( '/module\_Zend Optimizer\+.+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $opcache) ) { } // todo

    if ( function_exists('accelerator_get_configuration') ) { echo '<h2>general</h2>'; $configuration=accelerator_get_configuration(); }
    if ( function_exists('opcache_get_configuration') ) { echo '<h2>general</h2>'; $configuration=opcache_get_configuration(); }

    if ( !empty($configuration['version']['version']) ) {
    $version=array('Version'=>$configuration['version']['accelerator_product_name'].' '.$configuration['version']['version']);
    $version=array('Version'=>$configuration['version']['opcache_product_name'].' '.$configuration['version']['version']);
    print_table($version);
    }

    if ( !empty($optimizerplus[1]) ) { echo $optimizerplus[1]; }
    if ( !empty($opcache[1]) ) { echo $opcache[1]; }

    if ( function_exists('accelerator_get_status') && $status=accelerator_get_status() ) {
    if ( function_exists('opcache_get_status') && $status=opcache_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']);
    if ( !empty($status['opcache_statistics']['last_restart_time']) ) {
    $status['opcache_statistics']['last_restart']=time_since(time(),$status['opcache_statistics']['last_restart_time']);
    }
    unset($status['accelerator_statistics']['last_restart_time']);
    unset($status['opcache_statistics']['last_restart_time']);
    echo '<h2>statistics</h2>';
    print_table($status['accelerator_statistics']);
    print_table($status['opcache_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 ( !empty($opcache[2]) ) { echo '<h2>runtime</h2>'; echo $opcache[2]; }

    if ( $functions=get_extension_funcs('zend optimizer+') ) { echo '<h2>functions</h2>'; print_table($functions); }

    @@ -169,25 +175,26 @@ function print_table($array) {
    }

    function files_display() {
    $status=accelerator_get_status();
    $status=opcache_get_status();
    if ( empty($status['scripts']) ) {return;}
    $time=time(); $sort=0; $group=0;
    if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
    $time=time(); $sort=0;
    $nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
    $nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
    $group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;}
    $groupset=array_fill(0,9,''); $groupset[$group]=' class="b" ';

    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>';
    echo '<div class="meta">
    <a ',$groupset[0],'href="',$nogroup,'">ungroup</a> |
    <a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> |
    <a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> |
    <a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> |
    <a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> |
    <a ',$groupset[5],'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;}
    if ( !$group ) { $files =& $status['scripts']; }
    else {
    $files=array();
    foreach ($status['scripts'] as $data) {
    if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) {
    @@ -211,32 +218,31 @@ function files_display() {
    'last_used_timestamp'=>SORT_NUMERIC,
    'timestamp'=>SORT_NUMERIC
    );
    $titles=array('','path',$group?'files':'','size','hits','last used','created');
    $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;}
    $sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
    if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
    $arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' &#x25BC;':' &#x25B2;';
    $direction=$direction>0?SORT_DESC:SORT_ASC;
    $column=array();
    foreach ($files as $data) { $column[]=$data[$key]; }
    $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>';
    <tr class="h">';
    foreach ($titles as $column=>$title) {
    if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
    }
    echo ' </tr>';
    foreach ($files as $data) {
    echo '<tr>
    <td class="v" nowrap>',$data['full_path'],'</td>',
    (empty($group)?'':'<td class="vr">'.$data['files'].'</td>'),
    ($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>',
  14. @ck-on ck-on revised this gist Feb 26, 2013. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion ocp.php
    Original file line number Diff line number Diff line change
    @@ -22,7 +22,7 @@
    */

    ini_set('display_errors','1'); error_reporting(-1);
    // ini_set('display_errors','1'); error_reporting(-1);

    if ( !empty($_GET['CLEAR']) ) {
    if ( function_exists('accelerator_reset') ) { accelerator_reset(); }
  15. @ck-on ck-on revised this gist Feb 18, 2013. 1 changed file with 3 additions and 2 deletions.
    5 changes: 3 additions & 2 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -11,6 +11,7 @@
    * 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
    There is no way to tell how long cache has been running if it has never been reset
    accelerator_reset function doesn't just clear the cache, it restarts the module entirely?
    * todo:
    @@ -105,9 +106,9 @@
    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']);
    $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']);
    }
  16. @ck-on ck-on revised this gist Feb 18, 2013. 1 changed file with 149 additions and 100 deletions.
    249 changes: 149 additions & 100 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -1,60 +1,65 @@
    <?php
    /*
    OCP - Optimizer+ Control Panel, by _ck_
    Version 0.0.2
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements!
    Version 0.0.4
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements
    ** Quick'n'Dirty first version
    * 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 timestamp, not when it was first put into the cache :-(
    accelerator_reset function doesn't just clear the cache, it literally restarts the module entirely
    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:
    File sorting/directory filter
    Extract variables for prefered ordering instead of just dumping into tables
    CSS graph of memory use, free, wasted
    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(); }
    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" />
    <title>OCP - Optimizer+ Control Panel</title>
    <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />

    <style type="text/css">
    body {background-color: #ffffff; color: #000000;}
    body, td, th, h1, h2 {font-family: sans-serif;}
    pre {margin: 0px; font-family: monospace;}
    a:link {color: #000099; text-decoration: none; background-color: #ffffff;}
    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 #000000; 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: #000000; width:50%; white-space:nowrap;}
    .h {background-color: #9999cc; font-weight: bold; color: #000000;}
    .v {background-color: #cccccc; color: #000000;}
    .vr {background-color: #cccccc; text-align: right; color: #000000;}
    img {float: right; border: 0px;}
    hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000000;}
    .meta, .small {font-size: 75%;}
    .meta a {margin: 0 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; }
    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>

    @@ -65,118 +70,89 @@

    <div class="buttons">
    <a href="?ALL=1">Detailed</a>
    <a href="?FILES=1">Files Cached</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/">source</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')) { die('<h2>Optimizer+ not detected?</h2>'); }

    if (!empty($_GET['FILES'])) {
    echo '<h2>files cached</h2>';
    if ( function_exists('accelerator_get_status') && $status=accelerator_get_status() ) {
    // print '<pre>'; print_r($status['scripts']);
    $time=time();
    echo '<table border="0" cellpadding="3" width="780">
    <tr class="h"><th>script</th><th>hits</th><th>size</th><th>last used</th><th>created</th></tr>';
    if (!empty($status['scripts'])) {
    foreach ($status['scripts'] as $data) {
    echo '<tr><td class="v" nowrap>',$data['full_path'],'</td>',
    '<td class="v" align="right">',$data['hits'],'</td>',
    '<td class="v" align="right">',round($data['memory_consumption']/1024),'K</td>',
    '<td class="v">',time_since($time,$data['last_used_timestamp']),'</td>',
    '<td class="v">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td></tr>';

    }
    }
    }
    exit;
    }
    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; }

    // some info is only available via phpinfo, so sadly buffering capture has to be used
    ob_start(); phpinfo(8); $phpinfo = ob_get_contents(); ob_end_clean();
    $find='/module\_Zend Optimizer\+.+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s';
    if ( !preg_match($find,$phpinfo, $zend) ) { } // todo
    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

    echo '<h2>general</h2>';
    if ( function_exists('accelerator_get_configuration') ) { echo '<h2>general</h2>'; $configuration=accelerator_get_configuration(); }

    if ( function_exists('accelerator_get_configuration') ) {
    $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($configuration['version']['version']) ) {
    $version=array('Version'=>$configuration['version']['accelerator_product_name'].' '.$configuration['version']['version']);
    print_table($version);
    }

    if ( !empty($zend[1]) ) { echo $zend[1]; }
    if ( !empty($optimizerplus[1]) ) { echo $optimizerplus[1]; }

    if (function_exists('accelerator_get_status') && $status=accelerator_get_status()) {
    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']);
    }
    unset($status['accelerator_statistics']['last_restart_time']);
    echo '<h2>statistics</h2>';
    print_table($status['accelerator_statistics']);
    // print_r(accelerator_get_status());
    // print_r(get_loaded_extensions(true));
    }

    if (empty($_GET['ALL'])) {exit;}
    if ( empty($_GET['ALL']) ) {exit;}

    if ( !empty($configuration['blacklist']) ) {
    echo '<h2>blacklist</h2>';
    print_table($configuration['blacklist']);
    }
    if ( !empty($configuration['blacklist']) ) { echo '<h2>blacklist</h2>'; print_table($configuration['blacklist']); }

    echo '<h2>runtime</h2>';
    if ( !empty($zend[2]) ) { echo $zend[2]; }
    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); }

    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'; }
    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'; }
    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';}
    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)) {
    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'; }
    if ( $value>1048576) { $value=round($value/1048576,1).'M'; }
    elseif ( is_float($value) ) { $value=round($value,1); }
    }
    }
    @@ -191,7 +167,80 @@ function print_table($array) {
    echo '</table>';
    }

    ?>
    </div>
    </body>
    </html>
    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>';
    }
  17. @ck-on ck-on revised this gist Feb 15, 2013. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion ocp.php
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    <?php
    /*
    OCP - Optimizer+ Control Panel, by _ck_
    Verision 0.0.2
    Version 0.0.2
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements!
    ** Quick'n'Dirty first version
  18. @ck-on ck-on created this gist Feb 15, 2013.
    197 changes: 197 additions & 0 deletions ocp.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,197 @@
    <?php
    /*
    OCP - Optimizer+ Control Panel, by _ck_
    Verision 0.0.2
    Free for any kind of use or modification, I am not responsible for anything, please share your improvements!
    ** Quick'n'Dirty first version
    * known problems/limitations:
    Zend only stores the file timestamp, not when it was first put into the cache :-(
    accelerator_reset function doesn't just clear the cache, it literally restarts the module entirely
    * todo:
    File sorting/directory filter
    Extract variables for prefered ordering instead of just dumping into tables
    CSS graph of memory use, free, wasted
    */

    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: #ffffff; color: #000000;}
    body, td, th, h1, h2 {font-family: sans-serif;}
    pre {margin: 0px; font-family: monospace;}
    a:link {color: #000099; text-decoration: none; background-color: #ffffff;}
    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 #000000; 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: #000000; width:50%; white-space:nowrap;}
    .h {background-color: #9999cc; font-weight: bold; color: #000000;}
    .v {background-color: #cccccc; color: #000000;}
    .vr {background-color: #cccccc; text-align: right; color: #000000;}
    img {float: right; border: 0px;}
    hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000000;}
    .meta, .small {font-size: 75%;}
    .meta a {margin: 0 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">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/">source</a>
    </div>

    <?php

    if (!function_exists('accelerator_get_status')) { die('<h2>Optimizer+ not detected?</h2>'); }

    if (!empty($_GET['FILES'])) {
    echo '<h2>files cached</h2>';
    if ( function_exists('accelerator_get_status') && $status=accelerator_get_status() ) {
    // print '<pre>'; print_r($status['scripts']);
    $time=time();
    echo '<table border="0" cellpadding="3" width="780">
    <tr class="h"><th>script</th><th>hits</th><th>size</th><th>last used</th><th>created</th></tr>';
    if (!empty($status['scripts'])) {
    foreach ($status['scripts'] as $data) {
    echo '<tr><td class="v" nowrap>',$data['full_path'],'</td>',
    '<td class="v" align="right">',$data['hits'],'</td>',
    '<td class="v" align="right">',round($data['memory_consumption']/1024),'K</td>',
    '<td class="v">',time_since($time,$data['last_used_timestamp']),'</td>',
    '<td class="v">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td></tr>';

    }
    }
    }
    exit;
    }


    // some info is only available via phpinfo, so sadly buffering capture has to be used
    ob_start(); phpinfo(8); $phpinfo = ob_get_contents(); ob_end_clean();
    $find='/module\_Zend Optimizer\+.+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s';
    if ( !preg_match($find,$phpinfo, $zend) ) { } // todo

    echo '<h2>general</h2>';

    if ( function_exists('accelerator_get_configuration') ) {
    $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($zend[1]) ) { echo $zend[1]; }

    if (function_exists('accelerator_get_status') && $status=accelerator_get_status()) {
    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']);
    // print_r(accelerator_get_status());
    // print_r(get_loaded_extensions(true));
    }

    if (empty($_GET['ALL'])) {exit;}

    if ( !empty($configuration['blacklist']) ) {
    echo '<h2>blacklist</h2>';
    print_table($configuration['blacklist']);
    }

    echo '<h2>runtime</h2>';
    if ( !empty($zend[2]) ) { echo $zend[2]; }


    if ( $functions=get_extension_funcs('zend optimizer+') ) {
    echo '<h2>functions</h2>';
    print_table($functions);
    }

    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>';
    }

    ?>
    </div>
    </body>
    </html>