Board logo

标题: PHP5.6+Zend Guard Loader/Zend OPcache [打印本页]

作者: admin    时间: 2019-9-14 20:40     标题: 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 在浏览器上查看PHP测试页: http://192.168.168.130/phpinfo.php 图片1.png 测试: [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 图片3.png 服务器本地查看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 再次测试: [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 安装或取消安装: 图片6.png OPcache安装成功: 图片7.png 服务器本地查看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 图片9.png 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 图片11.png 再次查看PHP测试页,可以看到OPcache的缓存功能已经关闭: 图片12.png 再次测试: [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 图片14.png 再次查看PHP测试页,可以看到OPcache的缓存功能已经启用: 图片15.png 再次测试: [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. if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); }
  144. if ( !empty($opcache[3]) ) { echo '<h2 id="runtime">runtime</h2>'; echo $opcache[3]; }
  145. $name='zend opcache'; $functions=get_extension_funcs($name);
  146. if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); }
  147. if ($functions) { echo '<h2 id="functions">functions</h2>'; print_table($functions); } else { $name=''; }
  148. $level=trim(CACHEPREFIX,'_').'.optimization_level';
  149. if (isset($configuration['directives'][$level])) {
  150. echo '<h2 id="optimization">optimization levels</h2>';
  151. $levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
  152. $levels=array(
  153. 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>',
  154. 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>',
  155. 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>',
  156. 4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)',
  157. 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)',
  158. 9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)',
  159. 10=>'Remove NOPs'
  160. );
  161. echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>';
  162. foreach ($levels as $pass=>$description) {
  163. $disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':'';
  164. echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>';
  165. }
  166. echo '</table>';
  167. }
  168. if ( isset($_GET['DUMP']) ) {
  169. if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); }
  170. foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
  171. exit;
  172. }
  173. meta_display();
  174. echo '</div></body></html>';
  175. exit;
  176. function time_since($time,$original,$extended=0,$text='ago') {
  177. $time = $time - $original;
  178. $day = $extended? floor($time/86400) : round($time/86400,0);
  179. $amount=0; $unit='';
  180. if ( $time < 86400) {
  181. if ( $time < 60) { $amount=$time; $unit='second'; }
  182. elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
  183. else { $amount=floor($time/3600); $unit='hour'; }
  184. }
  185. elseif ( $day < 14) { $amount=$day; $unit='day'; }
  186. elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; }
  187. elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
  188. else { $amount=intval(2*($day/365))/2; $unit='year'; }
  189. if ( $amount!=1) {$unit.='s';}
  190. if ($extended && $time>60) { $text=' and '.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,'').$text; }
  191. return $amount.' '.$unit.' '.$text;
  192. }
  193. function print_table($array,$headers=false) {
  194. if ( empty($array) || !is_array($array) ) {return;}
  195. echo '<table border="0" cellpadding="3" width="600">';
  196. if (!empty($headers)) {
  197. if (!is_array($headers)) {$headers=array_keys(reset($array));}
  198. echo '<tr class="h">';
  199. foreach ($headers as $value) { echo '<th>',$value,'</th>'; }
  200. echo '</tr>';
  201. }
  202. foreach ($array as $key=>$value) {
  203. echo '<tr>';
  204. if ( !is_numeric($key) ) {
  205. $key=ucwords(str_replace('_',' ',$key));
  206. echo '<td class="e">',$key,'</td>';
  207. if ( is_numeric($value) ) {
  208. if ( $value>1048576) { $value=round($value/1048576,1).'M'; }
  209. elseif ( is_float($value) ) { $value=round($value,1); }
  210. }
  211. }
  212. if ( is_array($value) ) {
  213. foreach ($value as $column) {
  214. echo '<td class="v">',$column,'</td>';
  215. }
  216. echo '</tr>';
  217. }
  218. else { echo '<td class="v">',$value,'</td></tr>'; }
  219. }
  220. echo '</table>';
  221. }
  222. function files_display() {
  223. $status=call_user_func(CACHEPREFIX.'get_status');
  224. if ( empty($status['scripts']) ) {return;}
  225. if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
  226. $time=time(); $sort=0;
  227. $nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  228. $nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  229. $group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;}
  230. $groupset=array_fill(0,9,''); $groupset[$group]=' class="b" ';
  231. echo '<div class="meta">
  232. <a ',$groupset[0],'href="',$nogroup,'">ungroup</a> |
  233. <a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> |
  234. <a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> |
  235. <a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> |
  236. <a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> |
  237. <a ',$groupset[5],'href="',$nogroup,'&GROUP=5">5</a>
  238. </div>';
  239. if ( !$group ) { $files =& $status['scripts']; }
  240. else {
  241. $files=array();
  242. foreach ($status['scripts'] as $data) {
  243. if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) {
  244. if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); }
  245. $files[$path[0]]['full_path']=$path[0];
  246. $files[$path[0]]['files']++;
  247. $files[$path[0]]['memory_consumption']+=$data['memory_consumption'];
  248. $files[$path[0]]['hits']+=$data['hits'];
  249. if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];}
  250. if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];}
  251. }
  252. }
  253. }
  254. if ( !empty($_GET['SORT']) ) {
  255. $keys=array(
  256. 'full_path'=>SORT_STRING,
  257. 'files'=>SORT_NUMERIC,
  258. 'memory_consumption'=>SORT_NUMERIC,
  259. 'hits'=>SORT_NUMERIC,
  260. 'last_used_timestamp'=>SORT_NUMERIC,
  261. 'timestamp'=>SORT_NUMERIC
  262. );
  263. $titles=array('','path',$group?'files':'','size','hits','last used','created');
  264. $offsets=array_keys($keys);
  265. $key=intval($_GET['SORT']);
  266. $direction=$key>0?1:-1;
  267. $key=abs($key)-1;
  268. $key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets);
  269. $sort=array_search($key,$offsets)+1;
  270. $sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
  271. if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
  272. $arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' ▼':' ▲';
  273. $direction=$direction>0?SORT_DESC:SORT_ASC;
  274. $column=array(); foreach ($files as $data) { $column[]=$data[$key]; }
  275. array_multisort($column, $keys[$key], $direction, $files);
  276. }
  277. echo '<table border="0" cellpadding="3" width="960" id="files">
  278. <tr class="h">';
  279. foreach ($titles as $column=>$title) {
  280. if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
  281. }
  282. echo ' </tr>';
  283. foreach ($files as $data) {
  284. echo '<tr>
  285. <td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>',
  286. ($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
  287. '<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
  288. '<td class="vr">',number_format($data['hits']),'</td>',
  289. '<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>',
  290. '<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td>
  291. </tr>';
  292. }
  293. echo '</table>';
  294. }
  295. function graphs_display() {
  296. $graphs=array();
  297. $colors=array('green','brown','red');
  298. $primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
  299. $configuration=call_user_func(CACHEPREFIX.'get_configuration');
  300. $status=call_user_func(CACHEPREFIX.'get_status');
  301. $graphs['memory']['total']=$configuration['directives']['opcache.memory_consumption'];
  302. $graphs['memory']['free']=$status['memory_usage']['free_memory'];
  303. $graphs['memory']['used']=$status['memory_usage']['used_memory'];
  304. $graphs['memory']['wasted']=$status['memory_usage']['wasted_memory'];
  305. $graphs['keys']['total']=$status[CACHEPREFIX.'statistics']['max_cached_keys'];
  306. foreach ($primes as $prime) { if ($prime>=$graphs['keys']['total']) { $graphs['keys']['total']=$prime; break;} }
  307. $graphs['keys']['free']=$graphs['keys']['total']-$status[CACHEPREFIX.'statistics']['num_cached_keys'];
  308. $graphs['keys']['scripts']=$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
  309. $graphs['keys']['wasted']=$status[CACHEPREFIX.'statistics']['num_cached_keys']-$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
  310. $graphs['hits']['total']=0;
  311. $graphs['hits']['hits']=$status[CACHEPREFIX.'statistics']['hits'];
  312. $graphs['hits']['misses']=$status[CACHEPREFIX.'statistics']['misses'];
  313. $graphs['hits']['blacklist']=$status[CACHEPREFIX.'statistics']['blacklist_misses'];
  314. $graphs['hits']['total']=array_sum($graphs['hits']);
  315. $graphs['restarts']['total']=0;
  316. $graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
  317. $graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
  318. $graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
  319. $graphs['restarts']['total']=array_sum($graphs['restarts']);
  320. foreach ( $graphs as $caption=>$graph) {
  321. echo '<div class="graph"><div class="h">',$caption,'</div><table border="0" cellpadding="0" cellspacing="0">';
  322. foreach ($graph as $label=>$value) {
  323. 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;}
  324. $percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%';
  325. 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>';
  326. $key++; $totaldisplay='';
  327. }
  328. echo '</table></div>',"\n";
  329. }
  330. }
  331. function meta_display() {
  332. ?>
  333. <div class="meta">
  334. <a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
  335. <a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
  336. <a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
  337. <a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
  338. <a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
  339. <a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
  340. </div>
  341. <?php
  342. }
复制代码
登录Zend OPcache的控制面板: http://192.168.168.130/ocp.php 图片16.png 注释:点击“Refresh”会刷新数据。 图片17.png 图片18.png Zend OPcache的控制面板中的数据跟PHP测试页中的数据是一致的: 图片19.png ###### 在Zend OPcache的控制面板中,清空缓存数据: 图片20.png 图片21.png 清空缓存数据成功: 图片22.png 图片23.png ############ ############ 卸载Zend OPcache: [root@localhost ~]# cd /root/lnmp1.3-full [root@localhost lnmp1.3-full]# ./addons.sh uninstall opcache 图片24.png 图片25.png 相关文章: Discuz!7.2+Zend OPcache UPUPW_AP5.6+XCache/OPCache+ionCube Loader+Memcached Windows2008R2_IIS+PHP Manger+Zend Guard Loader/OPcache ################################# ################################# 亲,学习研究也要劳逸结合哦,来我微店逛逛,买点东西好好犒劳犒劳自己和家人吧^_^^_^ 休闲零食传承世家风干牛肉干 手撕风干牛肉四川特产【非偏远地区满79包邮】 niur.png 长虹办公室鼠标加热保暖桌垫毯电脑暖手桌面发热板电热台板写字台 dianzi.png 飞科电熨斗蒸汽家用熨斗家用电烫斗蒸气手持迷你电熨斗FI9308包邮 weidou.png 新款男长款拉链潮男士钱包男士手拿包 商务皮夹钱夹-JKPJ1806 nanbao.png 韩版定型斜挎单肩手提包SN-两层活动女包8874 nvbao.png

图片附件: dianzi.png (2019-10-4 16:17, 642.61 KB) / 下载次数 56
http://blog.zhuohua.store/attachment.php?aid=2167&k=1a9db95cc41fe6c50cc4482ec8f70503&t=1714470768&sid=a6J2Ds



图片附件: nanbao.png (2019-10-4 16:17, 598.85 KB) / 下载次数 55
http://blog.zhuohua.store/attachment.php?aid=2168&k=895d9a4f1f95baf5f9145b27fec6cd7d&t=1714470768&sid=a6J2Ds



图片附件: niur.png (2019-10-4 16:17, 571.82 KB) / 下载次数 61
http://blog.zhuohua.store/attachment.php?aid=2169&k=ebd04f5153194dcb6ba4926c3b6cfa8c&t=1714470768&sid=a6J2Ds



图片附件: nvbao.png (2019-10-4 16:17, 484.55 KB) / 下载次数 56
http://blog.zhuohua.store/attachment.php?aid=2170&k=8b184de84bc8c5ef70ade7c24010c0ce&t=1714470768&sid=a6J2Ds



图片附件: weidou.png (2019-10-4 16:17, 338.72 KB) / 下载次数 54
http://blog.zhuohua.store/attachment.php?aid=2171&k=c51143ae5405abd710da4e8ba2d98084&t=1714470768&sid=a6J2Ds



图片附件: 图片1.png (2021-3-2 13:06, 50.46 KB) / 下载次数 153
http://blog.zhuohua.store/attachment.php?aid=15743&k=6a399860028a683e12aed7459c8b51e7&t=1714470768&sid=a6J2Ds



图片附件: 图片2.png (2021-3-2 13:08, 55.33 KB) / 下载次数 142
http://blog.zhuohua.store/attachment.php?aid=15744&k=b28230167f81ea8804c4b503c4a02d1e&t=1714470768&sid=a6J2Ds



图片附件: 图片3.png (2021-3-2 13:09, 85.69 KB) / 下载次数 157
http://blog.zhuohua.store/attachment.php?aid=15745&k=961d5f4f603b36354cded99f021e1494&t=1714470768&sid=a6J2Ds



图片附件: 图片4.png (2021-3-2 13:09, 33.75 KB) / 下载次数 151
http://blog.zhuohua.store/attachment.php?aid=15746&k=ed83b679fc5f96dffa89ff96084682be&t=1714470768&sid=a6J2Ds



图片附件: 图片5.png (2021-3-2 13:11, 152.54 KB) / 下载次数 147
http://blog.zhuohua.store/attachment.php?aid=15747&k=f80fcecf922530a0cc27784c252dc6d2&t=1714470768&sid=a6J2Ds



图片附件: 图片6.png (2021-3-2 13:11, 86.22 KB) / 下载次数 162
http://blog.zhuohua.store/attachment.php?aid=15748&k=69be666f36b6f55abacd4db766c31fa5&t=1714470768&sid=a6J2Ds



图片附件: 图片7.png (2021-3-2 13:11, 53.41 KB) / 下载次数 161
http://blog.zhuohua.store/attachment.php?aid=15749&k=a7744f96792c4a5d26d004bf368e5ea2&t=1714470768&sid=a6J2Ds



图片附件: 图片8.png (2021-3-2 13:12, 50.05 KB) / 下载次数 161
http://blog.zhuohua.store/attachment.php?aid=15750&k=920527d6a5a311b4c67a48956b934fdf&t=1714470768&sid=a6J2Ds



图片附件: 图片9.png (2021-3-2 13:12, 100.13 KB) / 下载次数 165
http://blog.zhuohua.store/attachment.php?aid=15751&k=6444fb0edd45ba522080fb6eb14478cf&t=1714470768&sid=a6J2Ds



图片附件: 图片10.png (2021-3-2 13:15, 69.46 KB) / 下载次数 153
http://blog.zhuohua.store/attachment.php?aid=15752&k=a0b538c072a47135b810d95f4b0c22f6&t=1714470768&sid=a6J2Ds



图片附件: 图片11.png (2021-3-2 13:15, 85.69 KB) / 下载次数 181
http://blog.zhuohua.store/attachment.php?aid=15753&k=214c4b953ad76001133565be981eec78&t=1714470768&sid=a6J2Ds



图片附件: 图片12.png (2021-3-2 13:16, 20.81 KB) / 下载次数 164
http://blog.zhuohua.store/attachment.php?aid=15754&k=8ecdb58bd2be638b8cc0fa5e5dc7c5ee&t=1714470768&sid=a6J2Ds



图片附件: 图片13.png (2021-3-2 13:17, 68.95 KB) / 下载次数 160
http://blog.zhuohua.store/attachment.php?aid=15755&k=e1f8d9a5581b591a276c8e6e7a960f3f&t=1714470768&sid=a6J2Ds



图片附件: 图片14.png (2021-3-2 13:17, 85.69 KB) / 下载次数 163
http://blog.zhuohua.store/attachment.php?aid=15756&k=9c0b9e1ea7eca9d6119ebe98a19658b1&t=1714470768&sid=a6J2Ds



图片附件: 图片15.png (2021-3-2 13:18, 99.1 KB) / 下载次数 153
http://blog.zhuohua.store/attachment.php?aid=15757&k=f8b459a187251ff9e4a4d91537e34189&t=1714470768&sid=a6J2Ds



图片附件: 图片16.png (2021-3-2 13:20, 68.49 KB) / 下载次数 79
http://blog.zhuohua.store/attachment.php?aid=15758&k=899f71820c1bfe798bbff9468009cc75&t=1714470768&sid=a6J2Ds



图片附件: 图片17.png (2021-3-2 13:21, 52.97 KB) / 下载次数 80
http://blog.zhuohua.store/attachment.php?aid=15759&k=3ea17c4151ec41df88d2499ade35dfe9&t=1714470768&sid=a6J2Ds



图片附件: 图片18.png (2021-3-2 13:21, 45.48 KB) / 下载次数 75
http://blog.zhuohua.store/attachment.php?aid=15760&k=a2e26b3b091be8a3bc788b850e50a6c5&t=1714470768&sid=a6J2Ds



图片附件: 图片19.png (2021-3-2 13:21, 30.83 KB) / 下载次数 75
http://blog.zhuohua.store/attachment.php?aid=15761&k=16fbb4102fd6e8d570fd8106a3b8c7b4&t=1714470768&sid=a6J2Ds



图片附件: 图片20.png (2021-3-2 13:22, 64.35 KB) / 下载次数 71
http://blog.zhuohua.store/attachment.php?aid=15762&k=49b354d7a8d8c42ec1b8adc9a3679a27&t=1714470768&sid=a6J2Ds



图片附件: 图片21.png (2021-3-2 13:22, 4.46 KB) / 下载次数 77
http://blog.zhuohua.store/attachment.php?aid=15763&k=91f85ccd29c674a8ec77d8bb9e7682ab&t=1714470768&sid=a6J2Ds



图片附件: 图片22.png (2021-3-2 13:22, 62.98 KB) / 下载次数 73
http://blog.zhuohua.store/attachment.php?aid=15764&k=16910a8d689f5c6160255d9e79e3b901&t=1714470768&sid=a6J2Ds



图片附件: 图片23.png (2021-3-2 13:22, 41.45 KB) / 下载次数 75
http://blog.zhuohua.store/attachment.php?aid=15765&k=02df79ef073c7137bfd8bb462f03a8c8&t=1714470768&sid=a6J2Ds



图片附件: 图片24.png (2021-3-2 13:23, 16.39 KB) / 下载次数 65
http://blog.zhuohua.store/attachment.php?aid=15766&k=a96b4847135be97942934e5ac3512ed1&t=1714470768&sid=a6J2Ds



图片附件: 图片25.png (2021-3-2 13:23, 40.61 KB) / 下载次数 89
http://blog.zhuohua.store/attachment.php?aid=15767&k=9228652892b101713f9b5bbf90a2e934&t=1714470768&sid=a6J2Ds






欢迎光临 blog.zhuohua.store (http://blog.zhuohua.store/) Powered by Discuz! 7.2