blog.zhuohua.store's Archiver

admin 发表于 2019-9-14 20:40

PHP5.6+Zend Guard Loader/Zend OPcache

笺注:这是在 [url=http://blog.zhuohua.store/viewthread.php?tid=79&extra=page%3D1]LNMP一键安装包(lnmp_CentOS6.9)[/url] 的基础上进行。



默认安装并启用了Zend Guard Loader:
[root@localhost ~]# vi /usr/local/php/etc/php.ini
[color=DarkRed][Zend ZendGuard Loader]
zend_extension=/usr/local/zend/ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=[/color]


服务器本地查看PHP的信息:
[root@localhost ~]# php -v
PHP [color=Blue]5.6.22[/color] (cli) (built: Jun 23 2020 02:21:42)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    [color=Purple]with Zend Guard Loader v3.3, Copyright (c) 1998-2014, by Zend Technologies[/color]


PHP测试页的代码:
[root@localhost ~]# cat /home/wwwroot/default/[color=Blue]phpinfo.php [/color]
<?
phpinfo();
?>


在浏览器上查看PHP测试页:
http://192.168.168.130[color=Blue]/phpinfo.php [/color]
[attach]15743[/attach]


测试:
[root@localhost ~]# [color=DarkRed]ab[/color]
[color=Red]-bash: ab: command not found[/color]

[root@localhost ~]# yum -y install httpd-tools


[root@localhost ~]# [color=DarkRed]ab[/color] -n 1000 -c 100 [color=Blue]http://192.168.168.130/phpinfo.php[/color]
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.168.130 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx
Server Hostname:        192.168.168.130
Server Port:            80

Document Path:          /phpinfo.php
Document Length:        86197 bytes

Concurrency Level:      100
Time taken for tests:   3.791 seconds
Complete requests:      1000
Failed requests:        93
   (Connect: 0, Receive: 0, Length: 93, Exceptions: 0)
Write errors:           0
Total transferred:      86375900 bytes
HTML transferred:       86196900 bytes
Requests per second:    [color=DarkRed]263.75[/color] [#/sec] (mean)
Time per request:       379.140 [ms] (mean)
Time per request:       [color=DarkRed]3.791[/color] [ms] (mean, across all concurrent requests)
Transfer rate:          22248.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    5  14.4      0      58
Processing:    49  360  67.4    377     456
Waiting:        9  357  67.6    373     452
Total:         77  365  57.8    378     456

Percentage of the requests served within a certain time (ms)
  50%    378
  66%    393
  75%    400
  80%    404
  90%    413
  95%    417
  98%    424
  99%    438
100%    456 (longest request)

笺注:可以看到在启用Zend Guard Loader后,每秒最大处理请求次数为[color=DarkRed]263.75[/color]次,每个请求响应时间是[color=DarkRed]3.791[/color]毫秒。





############
############

OPcache是Zend开发的闭源但可以免费使用的PHP优化加速缓存组件。

假如要安装OPcache,要先关闭Zend Guard Loader :
[root@localhost ~]# vi /usr/local/php/etc/php.ini
[color=DarkOrchid]##在PHP配置文件中,注释掉 Zend Guard Loader 的配置代码:[/color]
[attach]15744[/attach]


[attach]15745[/attach]



服务器本地查看PHP的信息:
[root@localhost ~]# php -v
PHP 5.6.22 (cli) (built: Jun 23 2020 02:21:42)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies


在PHP测试页中,也可以看到 Zend Guard Loader 不见了:
[attach]15746[/attach]



再次测试:
[root@localhost ~]# ab -n 1000 -c 100 [color=Blue]http://192.168.168.130/phpinfo.php[/color]
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.168.130 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx
Server Hostname:        192.168.168.130
Server Port:            80

Document Path:          /phpinfo.php
Document Length:        85741 bytes

Concurrency Level:      100
Time taken for tests:   3.538 seconds
Complete requests:      1000
Failed requests:        103
   (Connect: 0, Receive: 0, Length: 103, Exceptions: 0)
Write errors:           0
Total transferred:      85919892 bytes
HTML transferred:       85740892 bytes
Requests per second:    [color=DarkRed]282.67[/color] [#/sec] (mean)
Time per request:       353.766 [ms] (mean)
Time per request:       [color=DarkRed]3.538[/color] [ms] (mean, across all concurrent requests)
Transfer rate:          23717.97 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    5  14.7      0      60
Processing:    23  335  61.7    348     451
Waiting:        1  332  62.3    345     449
Total:         66  340  51.7    349     451

Percentage of the requests served within a certain time (ms)
  50%    349
  66%    354
  75%    358
  80%    360
  90%    376
  95%    391
  98%    401
  99%    406
100%    451 (longest request)

笺注:可以看到在没有启用Zend Guard Loader时,每秒最大处理请求次数为[color=DarkRed]282.67[/color]次,每个请求响应时间是[color=DarkRed]3.538[/color]毫秒。





############

安装OPcache:
[root@localhost ~]# cd lnmp1.3-full
[root@localhost lnmp1.3-full]# [color=Blue]./addons.sh[/color]

[attach]15747[/attach]

安装或取消安装:
[attach]15748[/attach]

OPcache安装成功:
[attach]15749[/attach]



服务器本地查看PHP的信息:
[root@localhost ~]# php -v
PHP 5.6.22 (cli) (built: Jun 23 2020 02:21:42)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
     [color=Purple]with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies[/color]


在PHP测试页中,也可以看到OPcache出现了:
[attach]15750[/attach]

[attach]15751[/attach]



PHP配置文件中,关于OPcache的配置代码:(此时OPcache的缓存功能已启用)
[root@localhost ~]# vi /usr/local/php/etc/php.ini
[color=DarkRed];opcache
[Zend Opcache]
zend_extension="opcache.so"
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1[/color]

备注:
opcache.memory_consumption=128  [color=DarkOrchid]##为OPcache分配的共享内存,单位为MB;假如服务器的空闲内存比较多,这里的值可以调大一些。[/color]

opcache.max_accelerated_files=4000  [color=DarkOrchid]##缓存文件的最大数量,这里的值可以调大一些。[/color]

其他地方保持默认即可;网站文件内容更新后,并没有出现延迟。



测试OPcache的缓存功能:
[root@localhost ~]# ab -n 1000 -c 100 [color=Blue]http://192.168.168.130/phpinfo.php[/color]
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.168.130 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx
Server Hostname:        192.168.168.130
Server Port:            80

Document Path:          /phpinfo.php
Document Length:        89890 bytes

Concurrency Level:      100
Time taken for tests:   1.216 seconds
Complete requests:      1000
Failed requests:        996
   (Connect: 0, Receive: 0, Length: 996, Exceptions: 0)
Write errors:           0
Total transferred:      90071785 bytes
HTML transferred:       89892785 bytes
Requests per second:    [color=DarkRed]822.45[/color] [#/sec] (mean)
Time per request:       121.588 [ms] (mean)
Time per request:       [color=DarkRed]1.216[/color] [ms] (mean, across all concurrent requests)
Transfer rate:          72343.44 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   4.7      0      17
Processing:     2  115  19.7    120     139
Waiting:        0  114  19.7    119     138
Total:         18  117  16.4    120     142

Percentage of the requests served within a certain time (ms)
  50%    120
  66%    121
  75%    122
  80%    123
  90%    125
  95%    126
  98%    130
  99%    136
100%    142 (longest request)

笺注:可以看到在OPcache的缓存功能启用后,每秒最大处理请求次数为[color=DarkRed]822.45[/color]次,每个请求响应时间是[color=DarkRed]1.216[/color]毫秒。





############

在PHP配置文件中关闭OPcache的缓存功能:
[root@localhost ~]# vi /usr/local/php/etc/php.ini
加上:  [color=Blue]opcache.enable=0[/color]
[attach]15752[/attach]


[attach]15753[/attach]



再次查看PHP测试页,可以看到OPcache的缓存功能已经关闭:
[attach]15754[/attach]


再次测试:
[root@localhost ~]# ab -n 1000 -c 100 [color=Blue]http://192.168.168.130/phpinfo.php[/color]
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.168.130 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx
Server Hostname:        192.168.168.130
Server Port:            80

Document Path:          /phpinfo.php
Document Length:        88873 bytes

Concurrency Level:      100
Time taken for tests:   1.313 seconds
Complete requests:      1000
Failed requests:        109
   (Connect: 0, Receive: 0, Length: 109, Exceptions: 0)
Write errors:           0
Total transferred:      89051878 bytes
HTML transferred:       88872878 bytes
Requests per second:    [color=DarkRed]761.59[/color] [#/sec] (mean)
Time per request:       131.304 [ms] (mean)
Time per request:       [color=DarkRed]1.313[/color] [ms] (mean, across all concurrent requests)
Transfer rate:          66231.49 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   6.6      0      24
Processing:     2  124  22.8    129     145
Waiting:        0  123  23.0    129     145
Total:         25  126  17.8    129     147

Percentage of the requests served within a certain time (ms)
  50%    129
  66%    131
  75%    132
  80%    133
  90%    134
  95%    136
  98%    138
  99%    140
100%    147 (longest request)

笺注:可以看到在OPcache的缓存功能没有启用时,每秒最大处理请求次数为[color=DarkRed]761.59[/color]次,每个请求响应时间是[color=DarkRed]1.313[/color]毫秒。





############

在PHP配置文件中再次启用OPcache的缓存功能:
[root@localhost ~]# vi /usr/local/php/etc/php.ini
修改:  [color=Blue]opcache.enable=1[/color]
[attach]15755[/attach]


[attach]15756[/attach]


再次查看PHP测试页,可以看到OPcache的缓存功能已经启用:
[attach]15757[/attach]


再次测试:
[root@localhost ~]# ab -n 1000 -c 100 [color=Blue]http://192.168.168.130/phpinfo.php[/color]
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.168.130 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx
Server Hostname:        192.168.168.130
Server Port:            80

Document Path:          /phpinfo.php
Document Length:        89891 bytes

Concurrency Level:      100
Time taken for tests:   1.226 seconds
Complete requests:      1000
Failed requests:        981
   (Connect: 0, Receive: 0, Length: 981, Exceptions: 0)
Write errors:           0
Total transferred:      90071778 bytes
HTML transferred:       89892778 bytes
Requests per second:    [color=DarkRed]815.77[/color] [#/sec] (mean)
Time per request:       122.584 [ms] (mean)
Time per request:       [color=DarkRed]1.226[/color] [ms] (mean, across all concurrent requests)
Transfer rate:          71755.41 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   7.8      0      54
Processing:    32  115  19.7    121     127
Waiting:        0  114  20.0    120     126
Total:         57  117  14.1    121     140

Percentage of the requests served within a certain time (ms)
  50%    121
  66%    122
  75%    123
  80%    123
  90%    124
  95%    125
  98%    126
  99%    130
100%    140 (longest request)

笺注:可以看到在OPcache的缓存功能再次启用后,每秒最大处理请求次数为[color=DarkRed]815.77[/color]次,每个请求响应时间是[color=DarkRed]1.226[/color]毫秒。



总结:
在启用Zend Guard Loader后,每秒最大处理请求次数为263.75次,每个请求响应时间是3.791毫秒。

在没有启用Zend Guard Loader时,每秒最大处理请求次数为282.67次,每个请求响应时间是3.538毫秒。


在OPcache的缓存功能启用后,每秒最大处理请求次数为822.45次,每个请求响应时间是1.216毫秒。

在OPcache的缓存功能没有启用时,每秒最大处理请求次数为761.59次,每个请求响应时间是1.313毫秒。

在OPcache的缓存功能再次启用后,每秒最大处理请求次数为815.77次,每个请求响应时间是1.226毫秒。





############

Zend OPcache的控制面板的代码:
[root@iZj6c1a39n0ss415rjbuoqZ default]# pwd
[color=Purple]/home/wwwroot/default[/color]
[root@iZj6c1a39n0ss415rjbuoqZ default]# cat [color=Blue]ocp.php[/color]
[code]<?php
/*
OCP - Opcache Control Panel   (aka Zend Optimizer+ Control Panel for PHP)
Author: _ck_   (with contributions by GK, stasilok)
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)
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_"
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
- 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
File list filter

*/

// 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['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>
<html>
<head>
        <title>OCP - Opcache 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; 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; padding: 3px; }
        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;}
        .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%; }
        .meta {margin: 2em 0;}
        .meta a, th a {padding: 10px; white-space:nowrap; }
        .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 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;}
        .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>
<div class="center">

<h1><a href="?">Opcache Control Panel</a></h1>

<div class="buttons">
        <a href="?ALL=1">Details</a>
        <a href="?FILES=1&GROUP=2&SORT=3">Files</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>

<?php

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

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\>)/is', $phpinfo, $opcache) ) { }  // todo

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

$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') ) {
        $uptime=array();
        if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
                $uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
        }
        if ( !empty($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']);
}

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

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 id="functions">functions</h2>'; print_table($functions);  } else { $name=''; }

$level=trim(CACHEPREFIX,'_').'.optimization_level';
if (isset($configuration['directives'][$level])) {
        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>',
        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 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;
}

meta_display();

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

exit;

function time_since($time,$original,$extended=0,$text='ago') {
        $time =  $time - $original;
        $day = $extended? floor($time/86400) : round($time/86400,0);
        $amount=0; $unit='';
        if ( $time < 86400) {
                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)     { $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,$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) ) {
                        $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=call_user_func(CACHEPREFIX.'get_status');
        if ( empty($status['scripts']) ) {return;}
        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 ',$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 ( !$group ) { $files =& $status['scripts']; }
        else {
                $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
                );
                $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;
                $sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
                if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
                $arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' ▼':' ▲';
                $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" 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><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>',              
                                '<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>';
}

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']['keys']=$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";
        }
}

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
}
[/code]



登录Zend OPcache的控制面板:
http://192.168.168.130[color=Blue]/ocp.php[/color]
[attach]15758[/attach]
注释:点击“Refresh”会刷新数据。


[attach]15759[/attach]


[attach]15760[/attach]


Zend OPcache的控制面板中的数据跟PHP测试页中的数据是一致的:
[attach]15761[/attach]



######

在Zend OPcache的控制面板中,清空缓存数据:
[attach]15762[/attach]

[attach]15763[/attach]


清空缓存数据成功:
[attach]15764[/attach]


[attach]15765[/attach]





############
############

卸载Zend OPcache:
[root@localhost ~]# cd /root/lnmp1.3-full
[root@localhost lnmp1.3-full]# ./addons.sh uninstall [color=Blue]opcache[/color]

[attach]15766[/attach]

[attach]15767[/attach]





相关文章:
[url=http://blog.zhuohua.store/viewthread.php?tid=86&page=1&extra=#pid87]Discuz!7.2+Zend OPcache[/url]
[url=http://blog.zhuohua.store/viewthread.php?tid=46&page=1&extra=#pid47]UPUPW_AP5.6+XCache/OPCache+ionCube Loader+Memcached[/url]
[url=http://blog.zhuohua.store/viewthread.php?tid=373&page=1&extra=#pid655]Windows2008R2_IIS+PHP Manger+Zend Guard Loader/OPcache[/url]






#################################
#################################
[url=https://weidian.com/?userid=823531601&wfr=wx&sfr=app&source=shop]亲,学习研究也要劳逸结合哦,来我微店逛逛,买点东西好好犒劳犒劳自己和家人吧^_^^_^[/url]

[url=https://weidian.com/item.html?itemID=905482571142028053079&wfr=wx&sfr=app&source=goods_home]休闲零食传承世家风干牛肉干 手撕风干牛肉四川特产【非偏远地区满79包邮】[/url]
[url=https://weidian.com/item.html?itemID=905482571142028053079&wfr=wx&sfr=app&source=goods_home][attach]2169[/attach][/url]

[url=https://weidian.com/item.html?itemID=905482571141828030433&wfr=wx&sfr=app&source=goods_home]长虹办公室鼠标加热保暖桌垫毯电脑暖手桌面发热板电热台板写字台[/url]
[url=https://weidian.com/item.html?itemID=905482571141828030433&wfr=wx&sfr=app&source=goods_home][attach]2167[/attach][/url]

[url=https://weidian.com/item.html?itemID=905482571141697401852&wfr=wx&sfr=app&source=goods_home]飞科电熨斗蒸汽家用熨斗家用电烫斗蒸气手持迷你电熨斗FI9308包邮[/url]
[url=https://weidian.com/item.html?itemID=905482571141697401852&wfr=wx&sfr=app&source=goods_home][attach]2171[/attach][/url]

[url=https://weidian.com/item.html?itemID=905482571142562276239&wfr=wx&sfr=app&source=goods_home]新款男长款拉链潮男士钱包男士手拿包 商务皮夹钱夹-JKPJ1806[/url]
[url=https://weidian.com/item.html?itemID=905482571142562276239&wfr=wx&sfr=app&source=goods_home][attach]2168[/attach][/url]

[url=https://weidian.com/item.html?itemID=905482571142001608813&wfr=wx&sfr=app&source=goods_home]韩版定型斜挎单肩手提包SN-两层活动女包8874[/url]
[url=https://weidian.com/item.html?itemID=905482571142001608813&wfr=wx&sfr=app&source=goods_home][attach]2170[/attach][/url]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.