返回列表 发帖

PHP5.6+Zend Guard Loader/Zend OPcache

笺注:这是在 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
图片1.png
2021-3-2 13:06



测试:
[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 的配置代码:
图片2.png
2021-3-2 13:08



图片3.png
2021-3-2 13:09




服务器本地查看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 不见了:
图片4.png
2021-3-2 13:09




再次测试:
[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

图片5.png
2021-3-2 13:11


安装或取消安装:
图片6.png
2021-3-2 13:11


OPcache安装成功:
图片7.png
2021-3-2 13:11




服务器本地查看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出现了:
图片8.png
2021-3-2 13:12


图片9.png
2021-3-2 13:12




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
图片10.png
2021-3-2 13:15



图片11.png
2021-3-2 13:15




再次查看PHP测试页,可以看到OPcache的缓存功能已经关闭:
图片12.png
2021-3-2 13:16



再次测试:
[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
图片13.png
2021-3-2 13:17



图片14.png
2021-3-2 13:17



再次查看PHP测试页,可以看到OPcache的缓存功能已经启用:
图片15.png
2021-3-2 13:18



再次测试:
[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
  1. <?php
  2. /*
  3. OCP - Opcache Control Panel   (aka Zend Optimizer+ Control Panel for PHP)
  4. Author: _ck_   (with contributions by GK, stasilok)
  5. Version: 0.1.7
  6. Free for any kind of use or modification, I am not responsible for anything, please share your improvements

  7. * revision history
  8. 0.1.7  2015-09-01  regex fix for PHP7 phpinfo
  9. 0.1.6  2013-04-12  moved meta to footer so graphs can be higher and reduce clutter
  10. 0.1.5  2013-04-12  added graphs to visualize cache state, please report any browser/style bugs
  11. 0.1.4  2013-04-09  added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
  12. 0.1.3  2013-03-30  show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
  13. 0.1.2  2013-03-25  show optimization levels, number formatting, support for start_time in 7.0.2
  14. 0.1.1  2013-03-18  today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
  15. 0.1.0  2013-03-17  added group/sort indicators, replaced "accelerator_" functions with "opcache_"
  16. 0.0.6  2013-03-16  transition support as Zend renames product and functions for PHP 5.5 (stasilok)
  17. 0.0.5  2013-03-10  added refresh button (GK)
  18. 0.0.4  2013-02-18  added file grouping and sorting (click on headers) - code needs cleanup but gets the job done
  19. 0.0.2  2013-02-14  first public release

  20. * known problems/limitations:
  21. Unlike APC, the Zend OPcache API
  22. - cannot determine when a file was put into the cache
  23. - cannot change settings on the fly
  24. - cannot protect opcache functions by restricting execution to only specific scripts/paths

  25. * todo:
  26. Extract variables for prefered ordering and better layout instead of just dumping into tables
  27. File list filter

  28. */

  29. // ini_set('display_errors',1); error_reporting(-1);
  30. if ( count(get_included_files())>1 || php_sapi_name()=='cli' || empty($_SERVER['REMOTE_ADDR']) ) { die; }  // weak block against indirect access

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

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

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

  50. ?><!DOCTYPE html>
  51. <html>
  52. <head>
  53.         <title>OCP - Opcache Control Panel</title>
  54.         <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />

  55. <style type="text/css">
  56.         body {background-color: #fff; color: #000;}
  57.         body, td, th, h1, h2 {font-family: sans-serif;}
  58.         pre {margin: 0px; font-family: monospace;}
  59.         a:link,a:visited {color: #000099; text-decoration: none;}
  60.         a:hover {text-decoration: underline;}
  61.         table {border-collapse: collapse; width: 600px; }
  62.         .center {text-align: center;}
  63.         .center table { margin-left: auto; margin-right: auto; text-align: left;}
  64.         .center th { text-align: center !important; }
  65.         .middle {vertical-align:middle;}
  66.         td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline; padding: 3px; }
  67.         h1 {font-size: 150%;}
  68.         h2 {font-size: 125%;}
  69.         .p {text-align: left;}
  70.         .e {background-color: #ccccff; font-weight: bold; color: #000; width:50%; white-space:nowrap;}
  71.         .h {background-color: #9999cc; font-weight: bold; color: #000;}
  72.         .v {background-color: #cccccc; color: #000;}
  73.         .vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;}
  74.         .b {font-weight:bold;}
  75.         .white, .white a {color:#fff;}
  76.         img {float: right; border: 0px;}
  77.         hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;}
  78.         .meta, .small {font-size: 75%; }
  79.         .meta {margin: 2em 0;}
  80.         .meta a, th a {padding: 10px; white-space:nowrap; }
  81.         .buttons {margin:0 0 1em;}
  82.         .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;}
  83.         #files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
  84.         #files td.v a:hover {font-weight:bold; color:#ee0000;}
  85.         .graph {display:inline-block; width:145px; margin:1em 0 1em 1px; border:0; vertical-align:top;}
  86.         .graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
  87.         .graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
  88.         .graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
  89.         .graph .total {width:34px; text-align:center; padding:0 5px 0 0;}
  90.         .graph .total div {border:1px dashed #888; border-right:0; height:99%; width:12px; position:absolute; bottom:0; left:17px; z-index:-1;}
  91.         .graph .total span {background:#fff; font-weight:bold;}
  92.         .graph .actual {text-align:right; font-weight:bold; padding:0 5px 0 0;}
  93.         .graph .red {background:#ee0000;}
  94.         .graph .green {background:#00cc00;}
  95.         .graph .brown {background:#8B4513;}
  96. </style>
  97. <!--[if lt IE 9]><script type="text/javascript" defer="defer">
  98. 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';}}
  99. </script><![endif]-->
  100. </head>

  101. <body>
  102. <div class="center">

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

  104. <div class="buttons">
  105.         <a href="?ALL=1">Details</a>
  106.         <a href="?FILES=1&GROUP=2&SORT=3">Files</a>
  107.         <a href="?RESET=1" onclick="return confirm('RESET cache ?')">Reset</a>
  108.         <?php if ( function_exists(CACHEPREFIX.'invalidate') ) { ?>
  109.         <a href="?RECHECK=1" onclick="return confirm('Recheck all files in the cache ?')">Recheck</a>
  110.         <?php } ?>
  111.         <a href="?" onclick="window.location.reload(true); return false">Refresh</a>
  112. </div>

  113. <?php

  114. if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; }

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

  116. if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { exit; } }

  117. 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
  118. if ( !preg_match( '/module\_Zend.(Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/is', $phpinfo, $opcache) ) { }  // todo

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

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

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

  126. if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) {
  127.         $uptime=array();
  128.         if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
  129.                 $uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
  130.         }
  131.         if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
  132.                 $uptime['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
  133.         }
  134.         if (!empty($uptime)) {print_table($uptime);}

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

  136.         echo '<h2 id="memory">memory</h2>';
  137.         print_table($status['memory_usage']);
  138.         unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
  139.         echo '<h2 id="statistics">statistics</h2>';
  140.         print_table($status[CACHEPREFIX.'statistics']);
  141. }

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

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

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

  149. $level=trim(CACHEPREFIX,'_').'.optimization_level';
  150. if (isset($configuration['directives'][$level])) {
  151.         echo '<h2 id="optimization">optimization levels</h2>';
  152.         $levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
  153.         $levels=array(
  154.         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>',
  155.         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>',
  156.         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>',
  157.         4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)',
  158.         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)',
  159.         9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)',
  160.         10=>'Remove NOPs'
  161.         );
  162.         echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>';
  163.         foreach ($levels as $pass=>$description) {
  164.                 $disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':'';
  165.                 echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>';
  166.         }
  167.         echo '</table>';
  168. }

  169. if ( isset($_GET['DUMP']) ) {
  170.         if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); }
  171.         foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
  172.         exit;
  173. }

  174. meta_display();

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

  176. exit;

  177. function time_since($time,$original,$extended=0,$text='ago') {
  178.         $time =  $time - $original;
  179.         $day = $extended? floor($time/86400) : round($time/86400,0);
  180.         $amount=0; $unit='';
  181.         if ( $time < 86400) {
  182.                 if ( $time < 60)                { $amount=$time; $unit='second'; }
  183.                 elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
  184.                 else                            { $amount=floor($time/3600); $unit='hour'; }
  185.         }
  186.         elseif ( $day < 14)     { $amount=$day; $unit='day'; }
  187.         elseif ( $day < 56)     { $amount=floor($day/7); $unit='week'; }
  188.         elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
  189.         else {                    $amount=intval(2*($day/365))/2; $unit='year'; }

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

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

  194. function print_table($array,$headers=false) {
  195.         if ( empty($array) || !is_array($array) ) {return;}
  196.         echo '<table border="0" cellpadding="3" width="600">';
  197.         if (!empty($headers)) {
  198.                 if (!is_array($headers)) {$headers=array_keys(reset($array));}
  199.                 echo '<tr class="h">';
  200.                 foreach ($headers as $value) { echo '<th>',$value,'</th>'; }
  201.                 echo '</tr>';  
  202.         }
  203.         foreach ($array as $key=>$value) {
  204.                 echo '<tr>';
  205.                 if ( !is_numeric($key) ) {
  206.                         $key=ucwords(str_replace('_',' ',$key));
  207.                         echo '<td class="e">',$key,'</td>';
  208.                         if ( is_numeric($value) ) {
  209.                                         if ( $value>1048576) { $value=round($value/1048576,1).'M'; }
  210.                                         elseif ( is_float($value) ) { $value=round($value,1); }
  211.                         }
  212.                 }
  213.                 if ( is_array($value) ) {
  214.                         foreach ($value as $column) {
  215.                                 echo '<td class="v">',$column,'</td>';
  216.                         }
  217.                         echo '</tr>';
  218.                 }
  219.                 else { echo '<td class="v">',$value,'</td></tr>'; }
  220.         }
  221.         echo '</table>';
  222. }

  223. function files_display() {
  224.         $status=call_user_func(CACHEPREFIX.'get_status');
  225.         if ( empty($status['scripts']) ) {return;}
  226.         if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
  227.         $time=time(); $sort=0;
  228.         $nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  229.         $nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  230.         $group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;}
  231.         $groupset=array_fill(0,9,''); $groupset[$group]=' class="b" ';

  232.         echo '<div class="meta">
  233.                 <a ',$groupset[0],'href="',$nogroup,'">ungroup</a> |
  234.                 <a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> |
  235.                 <a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> |
  236.                 <a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> |
  237.                 <a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> |
  238.                 <a ',$groupset[5],'href="',$nogroup,'&GROUP=5">5</a>
  239.         </div>';

  240.         if ( !$group ) { $files =& $status['scripts']; }
  241.         else {
  242.                 $files=array();
  243.                 foreach ($status['scripts'] as $data) {
  244.                         if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) {
  245.                                 if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); }
  246.                                 $files[$path[0]]['full_path']=$path[0];
  247.                                 $files[$path[0]]['files']++;
  248.                                 $files[$path[0]]['memory_consumption']+=$data['memory_consumption'];
  249.                                 $files[$path[0]]['hits']+=$data['hits'];
  250.                                 if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];}
  251.                                 if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];}
  252.                         }
  253.                 }
  254.         }

  255.         if ( !empty($_GET['SORT']) ) {
  256.                 $keys=array(
  257.                         'full_path'=>SORT_STRING,
  258.                         'files'=>SORT_NUMERIC,
  259.                         'memory_consumption'=>SORT_NUMERIC,
  260.                         'hits'=>SORT_NUMERIC,
  261.                         'last_used_timestamp'=>SORT_NUMERIC,
  262.                         'timestamp'=>SORT_NUMERIC
  263.                 );
  264.                 $titles=array('','path',$group?'files':'','size','hits','last used','created');
  265.                 $offsets=array_keys($keys);
  266.                 $key=intval($_GET['SORT']);
  267.                 $direction=$key>0?1:-1;
  268.                 $key=abs($key)-1;
  269.                 $key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets);
  270.                 $sort=array_search($key,$offsets)+1;
  271.                 $sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
  272.                 if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
  273.                 $arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' ▼':' ▲';
  274.                 $direction=$direction>0?SORT_DESC:SORT_ASC;
  275.                 $column=array(); foreach ($files as $data) { $column[]=$data[$key]; }
  276.                 array_multisort($column, $keys[$key], $direction, $files);
  277.         }

  278.         echo '<table border="0" cellpadding="3" width="960" id="files">
  279.                         <tr class="h">';
  280.          foreach ($titles as $column=>$title) {
  281.                 if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
  282.          }
  283.          echo ' </tr>';
  284.         foreach ($files as $data) {
  285.                 echo '<tr>
  286.                                 <td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>',
  287.                                 ($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
  288.                                 '<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
  289.                                 '<td class="vr">',number_format($data['hits']),'</td>',              
  290.                                 '<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>',
  291.                                 '<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td>
  292.                         </tr>';
  293.         }
  294.         echo '</table>';
  295. }

  296. function graphs_display() {
  297.         $graphs=array();
  298.         $colors=array('green','brown','red');
  299.         $primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
  300.         $configuration=call_user_func(CACHEPREFIX.'get_configuration');
  301.         $status=call_user_func(CACHEPREFIX.'get_status');

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

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

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

  316.         $graphs['restarts']['total']=0;
  317.         $graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
  318.         $graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
  319.         $graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
  320.         $graphs['restarts']['total']=array_sum($graphs['restarts']);

  321.         foreach ( $graphs as $caption=>$graph) {
  322.         echo '<div class="graph"><div class="h">',$caption,'</div><table border="0" cellpadding="0" cellspacing="0">';
  323.         foreach ($graph as $label=>$value) {
  324.                 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;}
  325.                 $percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%';
  326.                 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>';
  327.                 $key++; $totaldisplay='';
  328.         }
  329.         echo '</table></div>',"\n";
  330.         }
  331. }

  332. function meta_display() {
  333. ?>
  334. <div class="meta">
  335.         <a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
  336.         <a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
  337.         <a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
  338.         <a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
  339.         <a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
  340.         <a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
  341. </div>
  342. <?php
  343. }
复制代码




登录Zend OPcache的控制面板:
http://192.168.168.130/ocp.php
图片16.png
2021-3-2 13:20

注释:点击“Refresh”会刷新数据。


图片17.png
2021-3-2 13:21



图片18.png
2021-3-2 13:21



Zend OPcache的控制面板中的数据跟PHP测试页中的数据是一致的:
图片19.png
2021-3-2 13:21




######

在Zend OPcache的控制面板中,清空缓存数据:
图片20.png
2021-3-2 13:22


图片21.png
2021-3-2 13:22



清空缓存数据成功:
图片22.png
2021-3-2 13:22



图片23.png
2021-3-2 13:22






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

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

图片24.png
2021-3-2 13:23


图片25.png
2021-3-2 13:23






相关文章:
Discuz!7.2+Zend OPcache
UPUPW_AP5.6+XCache/OPCache+ionCube Loader+Memcached
Windows2008R2_IIS+PHP Manger+Zend Guard Loader/OPcache






#################################
#################################
亲,学习研究也要劳逸结合哦,来我微店逛逛,买点东西好好犒劳犒劳自己和家人吧^_^^_^

休闲零食传承世家风干牛肉干 手撕风干牛肉四川特产【非偏远地区满79包邮】
niur.png
2019-10-4 16:17


长虹办公室鼠标加热保暖桌垫毯电脑暖手桌面发热板电热台板写字台
dianzi.png
2019-10-4 16:17


飞科电熨斗蒸汽家用熨斗家用电烫斗蒸气手持迷你电熨斗FI9308包邮
weidou.png
2019-10-4 16:17


新款男长款拉链潮男士钱包男士手拿包 商务皮夹钱夹-JKPJ1806
nanbao.png
2019-10-4 16:17


韩版定型斜挎单肩手提包SN-两层活动女包8874
nvbao.png
2019-10-4 16:17

返回列表