笺注:这是在 LNMP一键安装包(lnmp_CentOS6.9) 的基础上进行。
默认安装并启用了Zend Guard Loader:
[root@localhost ~]# vi /usr/local/php/etc/php.ini
[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=
服务器本地查看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
with Zend Guard Loader v3.3, Copyright (c) 1998-2014, by Zend Technologies
PHP测试页的代码:
[root@localhost ~]# cat /home/wwwroot/default/phpinfo.php
<?
phpinfo();
?>
在浏览器上查看PHP测试页:
http://192.168.168.130/phpinfo.php
测试:
[root@localhost ~]# ab
-bash: ab: command not found
[root@localhost ~]# yum -y install httpd-tools
[root@localhost ~]# ab -n 1000 -c 100 http://192.168.168.130/phpinfo.php
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: 263.75 [#/sec] (mean)
Time per request: 379.140 [ms] (mean)
Time per request: 3.791 [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后,每秒最大处理请求次数为263.75次,每个请求响应时间是3.791毫秒。
############
############
OPcache是Zend开发的闭源但可以免费使用的PHP优化加速缓存组件。
假如要安装OPcache,要先关闭Zend Guard Loader :
[root@localhost ~]# vi /usr/local/php/etc/php.ini
##在PHP配置文件中,注释掉 Zend Guard Loader 的配置代码:
服务器本地查看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 不见了:
再次测试:
[root@localhost ~]# ab -n 1000 -c 100 http://192.168.168.130/phpinfo.php
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: 282.67 [#/sec] (mean)
Time per request: 353.766 [ms] (mean)
Time per request: 3.538 [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时,每秒最大处理请求次数为282.67次,每个请求响应时间是3.538毫秒。
############
安装OPcache:
[root@localhost ~]# cd lnmp1.3-full
[root@localhost lnmp1.3-full]# ./addons.sh
安装或取消安装:
OPcache安装成功:
服务器本地查看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
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
在PHP测试页中,也可以看到OPcache出现了:
PHP配置文件中,关于OPcache的配置代码:(此时OPcache的缓存功能已启用)
[root@localhost ~]# vi /usr/local/php/etc/php.ini
;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
备注:
opcache.memory_consumption=128 ##为OPcache分配的共享内存,单位为MB;假如服务器的空闲内存比较多,这里的值可以调大一些。
opcache.max_accelerated_files=4000 ##缓存文件的最大数量,这里的值可以调大一些。
其他地方保持默认即可;网站文件内容更新后,并没有出现延迟。
测试OPcache的缓存功能:
[root@localhost ~]# ab -n 1000 -c 100 http://192.168.168.130/phpinfo.php
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: 822.45 [#/sec] (mean)
Time per request: 121.588 [ms] (mean)
Time per request: 1.216 [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的缓存功能启用后,每秒最大处理请求次数为822.45次,每个请求响应时间是1.216毫秒。
############
在PHP配置文件中关闭OPcache的缓存功能:
[root@localhost ~]# vi /usr/local/php/etc/php.ini
加上: opcache.enable=0
再次查看PHP测试页,可以看到OPcache的缓存功能已经关闭:
再次测试:
[root@localhost ~]# ab -n 1000 -c 100 http://192.168.168.130/phpinfo.php
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: 761.59 [#/sec] (mean)
Time per request: 131.304 [ms] (mean)
Time per request: 1.313 [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的缓存功能没有启用时,每秒最大处理请求次数为761.59次,每个请求响应时间是1.313毫秒。
############
在PHP配置文件中再次启用OPcache的缓存功能:
[root@localhost ~]# vi /usr/local/php/etc/php.ini
修改: opcache.enable=1
再次查看PHP测试页,可以看到OPcache的缓存功能已经启用:
再次测试:
[root@localhost ~]# ab -n 1000 -c 100 http://192.168.168.130/phpinfo.php
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: 815.77 [#/sec] (mean)
Time per request: 122.584 [ms] (mean)
Time per request: 1.226 [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的缓存功能再次启用后,每秒最大处理请求次数为815.77次,每个请求响应时间是1.226毫秒。
总结:
在启用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
/home/wwwroot/default
[root@iZj6c1a39n0ss415rjbuoqZ default]# cat ocp.php
- <?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
- }
复制代码
登录Zend OPcache的控制面板:
http://192.168.168.130/ocp.php
注释:点击“Refresh”会刷新数据。
Zend OPcache的控制面板中的数据跟PHP测试页中的数据是一致的:
######
在Zend OPcache的控制面板中,清空缓存数据:
清空缓存数据成功:
############
############
卸载Zend OPcache:
[root@localhost ~]# cd /root/lnmp1.3-full
[root@localhost lnmp1.3-full]# ./addons.sh uninstall opcache
相关文章:
Discuz!7.2+Zend OPcache
UPUPW_AP5.6+XCache/OPCache+ionCube Loader+Memcached
Windows2008R2_IIS+PHP Manger+Zend Guard Loader/OPcache
#################################
#################################
亲,学习研究也要劳逸结合哦,来我微店逛逛,买点东西好好犒劳犒劳自己和家人吧^_^^_^
休闲零食传承世家风干牛肉干 手撕风干牛肉四川特产【非偏远地区满79包邮】
长虹办公室鼠标加热保暖桌垫毯电脑暖手桌面发热板电热台板写字台
飞科电熨斗蒸汽家用熨斗家用电烫斗蒸气手持迷你电熨斗FI9308包邮
新款男长款拉链潮男士钱包男士手拿包 商务皮夹钱夹-JKPJ1806
韩版定型斜挎单肩手提包SN-两层活动女包8874
|