PHP7和HHVM比较
PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM。HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂了, 并且它不会自动重启。另外它采用JIT, 那么意味着, 重启以后要预热, 没有预热的情况下, 性能较为糟糕。并且多线程模型调试困难, 这对于追求稳定来说的Web服务来说, 是非常不适合的。

Nginx以及PHP7.0之前的版本可以参考此文:Linux环境Nginx安装与调试以及PHP安装

PHP7.0正式版已经在2015年11月份左右发布,目前是PHP7.0.2版本,本人最早是从2015年8月php7的第一个测试版跟起,现在正式版发布。

linux版本:64位CentOS 6.6

Nginx版本:nginx1.8.0

php版本:php-7.0.2

下载

# wget  http://php.net/get/php-7.0.2.tar.gz/from/a/mirror

 
建议安装之前先看看安装帮助文件INSTALL
 
解压安装
# tar zxvf php-7.0.2.tar.gz
# cd php-7.0.2
首先查看安装帮助
# ./configure   --help
# ./configure --prefix=/usr/local/php \
 --with-curl \
 --with-freetype-dir \
 --with-gd \
 --with-gettext \
 --with-iconv-dir \
 --with-kerberos \
 --with-libdir=lib64 \
 --with-libxml-dir \
 --with-mysqli \
 --with-openssl \
 --with-pcre-regex \
 --with-pdo-mysql \
 --with-pdo-sqlite \
 --with-pear \
 --with-png-dir \
 --with-xmlrpc \
 --with-xsl \
 --with-zlib \
 --enable-fpm \
 --enable-bcmath \
 --enable-libxml \
 --enable-inline-optimization \
 --enable-gd-native-ttf \
 --enable-mbregex \
 --enable-mbstring \
 --enable-opcache \
 --enable-pcntl \
 --enable-shmop \
 --enable-soap \
 --enable-sockets \
 --enable-sysvsem \
 --enable-xml \
 --enable-zip

如果配置错误,需要安装需要的模块,直接yum一并安装依赖库

# yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel MySQL pcre-devel

注意:安装php7beta3的时候有几处配置不过去,需要yum一下,现在php-7.0.2已经不用这样了。
# yum -y install curl-devel
# yum -y install libxslt-devel
 
编译安装
# make &&  make install

配置文件
# cp php.ini-development /usr/local/php/lib/php.ini
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# cp -R ./sapi/fpm/php-fpm /etc/init.d/php-fpm
 
需要注意的是php7中www.conf这个配置文件配置phpfpm的端口号等信息,如果你修改默认的9000端口号需在这里改,再改nginx的配置
启动
#  /etc/init.d/php-fpm
 
查看phpinfo()
php7和php5性能分析比较
[php] view plain copy

 

  1. <?php
  2. //time /usr/local/php5/bin/php search_by_key.php
  3. $a = array();
  4. for($i=0;$i<600000;$i++){
  5. $a[$i] = $i;
  6. }
  7. foreach($a as $i)
  8. {
  9. array_key_exists($i, $a);
  10. }
  11. ?>

生成一个 60 万元素的数组,通过查找key 的方式,来确定key是否存在。

PHP 5.4.44 版
[root@localhost www5.4.44]# time /usr/local/php5.4.44/bin/php search_by_key.php

real    0m0.351s
user    0m0.300s
sys     0m0.050s

PHP 5.5.28 版
[root@localhost www]# time /usr/local/php/bin/php search_by_key.php
real    0m0.361s
user    0m0.304s
sys     0m0.057s

PHP 7.0.0 版
[root@localhost www7]# time /usr/local/php7/bin/php search_by_key.php
real    0m0.114s
user    0m0.097s
sys     0m0.017s

 
很明显php7的性能是php5的3倍!
 
配置opcache
官网地址:http://php.net/opcache

使用下列推荐设置来获得较好的 性能:

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.save_comments 并且启用 opcache.enable_file_override。 需要提醒的是,在生产环境中使用上述配置之前,必须经过严格测试。 因为上述配置存在一个已知问题,它会引发一些框架和应用的异常, 尤其是在存在文档使用了备注注解的时候。

 
vim /usr/local/php7/etc/php.ini
# 加入
zend_extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20141001/opcache.so

重启

# killall php-fpm

#  /etc/init.d/php-fpm

 
 
 
如果上图不太明白,可以使用文末Opcache 状态测试代码(https://gist.github.com/ck-on/4959032)进行演示:
 
 
Opcache 状态测试代码(https://gist.github.com/ck-on/4959032)进行演示:
[php] view plain copy

 

  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.6
  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.6 2013-04-12 moved meta to footer so graphs can be higher and reduce clutter
  9. 0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
  10. 0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
  11. 0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
  12. 0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
  13. 0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
  14. 0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
  15. 0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
  16. 0.0.5 2013-03-10 added refresh button (GK)
  17. 0.0.4 2013-02-18 added file grouping and sorting (click on headers) - code needs cleanup but gets the job done
  18. 0.0.2 2013-02-14 first public release
  19. * known problems/limitations:
  20. Unlike APC, the Zend OPcache API
  21. - cannot determine when a file was put into the cache
  22. - cannot change settings on the fly
  23. - cannot protect opcache functions by restricting execution to only specific scripts/paths
  24. * todo:
  25. Extract variables for prefered ordering and better layout instead of just dumping into tables
  26. File list filter
  27. */
  28. // ini_set('display_errors',1); error_reporting(-1);
  29. if ( count(get_included_files())>1 || php_sapi_name()=='cli' || empty($_SERVER['REMOTE_ADDR']) ) { die; } // weak block against indirect access
  30. $time=time();
  31. define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));
  32. if ( !empty($_GET['RESET']) ) {
  33. if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); }
  34. header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
  35. exit;
  36. }
  37. if ( !empty($_GET['RECHECK']) ) {
  38. if ( function_exists(CACHEPREFIX.'invalidate') ) {
  39. $recheck=trim($_GET['RECHECK']); $files=call_user_func(CACHEPREFIX.'get_status');
  40. if (!empty($files['scripts'])) {
  41. foreach ($files['scripts'] as $file=>$value) {
  42. if ( $recheck==='1' || strpos($file,$recheck)===0 ) call_user_func(CACHEPREFIX.'invalidate',$file);
  43. }
  44. }
  45. header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
  46. } else { echo 'Sorry, this feature requires Zend Opcache newer than April 8th 2013'; }
  47. exit;
  48. }
  49. ?><!DOCTYPE html>
  50. <html>
  51. <head>
  52. <title>OCP - Opcache Control Panel</title>
  53. <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />
  54. <style type="text/css">
  55. body {background-color: #fff; color: #000;}
  56. body, td, th, h1, h2 {font-family: sans-serif;}
  57. pre {margin: 0px; font-family: monospace;}
  58. a:link,a:visited {color: #000099; text-decoration: none;}
  59. a:hover {text-decoration: underline;}
  60. table {border-collapse: collapse; width: 600px; }
  61. .center {text-align: center;}
  62. .center table { margin-left: auto; margin-right: auto; text-align: left;}
  63. .center th { text-align: center !important; }
  64. .middle {vertical-align:middle;}
  65. td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline; padding: 3px; }
  66. h1 {font-size: 150%;}
  67. h2 {font-size: 125%;}
  68. .p {text-align: left;}
  69. .e {background-color: #ccccff; font-weight: bold; color: #000; width:50%; white-space:nowrap;}
  70. .h {background-color: #9999cc; font-weight: bold; color: #000;}
  71. .v {background-color: #cccccc; color: #000;}
  72. .vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;}
  73. .b {font-weight:bold;}
  74. .white, .white a {color:#fff;}
  75. img {float: right; border: 0px;}
  76. hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;}
  77. .meta, .small {font-size: 75%; }
  78. .meta {margin: 2em 0;}
  79. .meta a, th a {padding: 10px; white-space:nowrap; }
  80. .buttons {margin:0 0 1em;}
  81. .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;}
  82. #files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
  83. #files td.v a:hover {font-weight:bold; color:#ee0000;}
  84. .graph {display:inline-block; width:145px; margin:1em 0 1em 1px; border:0; vertical-align:top;}
  85. .graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
  86. .graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
  87. .graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
  88. .graph .total {width:34px; text-align:center; padding:0 5px 0 0;}
  89. .graph .total div {border:1px dashed #888; border-right:0; height:99%; width:12px; position:absolute; bottom:0; left:17px; z-index:-1;}
  90. .graph .total span {background:#fff; font-weight:bold;}
  91. .graph .actual {text-align:right; font-weight:bold; padding:0 5px 0 0;}
  92. .graph .red {background:#ee0000;}
  93. .graph .green {background:#00cc00;}
  94. .graph .brown {background:#8B4513;}
  95. </style>
  96. <!--[if lt IE 9]><script type="text/javascript" defer="defer">
  97. 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';}}
  98. </script><![endif]-->
  99. </head>
  100. <body>
  101. <div class="center">
  102. <h1><a href="?">Opcache Control Panel</a></h1>
  103. <div class="buttons">
  104. <a href="?ALL=1">Details</a>
  105. <a href="?FILES=1&GROUP=2&SORT=3">Files</a>
  106. <a href="?RESET=1" onclick="return confirm('RESET cache ?')">Reset</a>
  107. <?php if ( function_exists(CACHEPREFIX.'invalidate') ) { ?>
  108. <a href="?RECHECK=1" onclick="return confirm('Recheck all files in the cache ?')">Recheck</a>
  109. <?php } ?>
  110. <a href="?" onclick="window.location.reload(true); return false">Refresh</a>
  111. </div>
  112. <?php
  113. if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; }
  114. if ( !empty($_GET['FILES']) ) { echo '<h2>files cached</h2>'; files_display(); echo '</div></body></html>'; exit; }
  115. if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { exit; } }
  116. 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
  117. if ( !preg_match( '/module\_Zend (Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $opcache) ) { } // todo
  118. if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); }
  119. $host=function_exists('gethostname')?@gethostname():@php_uname('n'); if (empty($host)) { $host=empty($_SERVER['SERVER_NAME'])?$_SERVER['HOST_NAME']:$_SERVER['SERVER_NAME']; }
  120. $version=array('Host'=>$host);
  121. $version['PHP Version']='PHP '.(defined('PHP_VERSION')?PHP_VERSION:'???').' '.(defined('PHP_SAPI')?PHP_SAPI:'').' '.(defined('PHP_OS')?' '.PHP_OS:'');
  122. $version['Opcache Version']=empty($configuration['version']['version'])?'???':$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version'];
  123. print_table($version);
  124. if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); }
  125. if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) {
  126. $uptime=array();
  127. if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
  128. $uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
  129. }
  130. if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
  131. $uptime['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
  132. }
  133. if (!empty($uptime)) {print_table($uptime);}
  134. if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; }
  135. echo '<h2 id="memory">memory</h2>';
  136. print_table($status['memory_usage']);
  137. unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
  138. echo '<h2 id="statistics">statistics</h2>';
  139. print_table($status[CACHEPREFIX.'statistics']);
  140. }
  141. if ( empty($_GET['ALL']) ) { meta_display(); exit; }
  142. if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); }
  143. if ( !empty($opcache[3]) ) { echo '<h2 id="runtime">runtime</h2>'; echo $opcache[3]; }
  144. $name='zend opcache'; $functions=get_extension_funcs($name);
  145. if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); }
  146. if ($functions) { echo '<h2 id="functions">functions</h2>'; print_table($functions); } else { $name=''; }
  147. $level=trim(CACHEPREFIX,'_').'.optimization_level';
  148. if (isset($configuration['directives'][$level])) {
  149. echo '<h2 id="optimization">optimization levels</h2>';
  150. $levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
  151. $levels=array(
  152. 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>',
  153. 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>',
  154. 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>',
  155. 4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)',
  156. 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)',
  157. 9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)',
  158. 10=>'Remove NOPs'
  159. );
  160. echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>';
  161. foreach ($levels as $pass=>$description) {
  162. $disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':'';
  163. echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>';
  164. }
  165. echo '</table>';
  166. }
  167. if ( isset($_GET['DUMP']) ) {
  168. if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); }
  169. foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
  170. exit;
  171. }
  172. meta_display();
  173. echo '</div></body></html>';
  174. exit;
  175. function time_since($time,$original,$extended=0,$text='ago') {
  176. $time = $time - $original;
  177. $day = $extended? floor($time/86400) : round($time/86400,0);
  178. $amount=0; $unit='';
  179. if ( $time < 86400) {
  180. if ( $time < 60) { $amount=$time; $unit='second'; }
  181. elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
  182. else    { $amount=floor($time/3600); $unit='hour'; }
  183. }
  184. elseif ( $day < 14) { $amount=$day; $unit='day'; }
  185. elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; }
  186. elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
  187. else {  $amount=intval(2*($day/365))/2; $unit='year'; }
  188. if ( $amount!=1) {$unit.='s';}
  189. if ($extended && $time>60) { $text=' and '.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,'').$text; }
  190. return $amount.' '.$unit.' '.$text;
  191. }
  192. function print_table($array,$headers=false) {
  193. if ( empty($array) || !is_array($array) ) {return;}
  194. echo '<table border="0" cellpadding="3" width="600">';
  195. if (!empty($headers)) {
  196. if (!is_array($headers)) {$headers=array_keys(reset($array));}
  197. echo '<tr class="h">';
  198. foreach ($headers as $value) { echo '<th>',$value,'</th>'; }
  199. echo '</tr>';
  200. }
  201. foreach ($array as $key=>$value) {
  202. echo '<tr>';
  203. if ( !is_numeric($key) ) {
  204. $key=ucwords(str_replace('_',' ',$key));
  205. echo '<td class="e">',$key,'</td>';
  206. if ( is_numeric($value) ) {
  207. if ( $value>1048576) { $value=round($value/1048576,1).'M'; }
  208. elseif ( is_float($value) ) { $value=round($value,1); }
  209. }
  210. }
  211. if ( is_array($value) ) {
  212. foreach ($value as $column) {
  213. echo '<td class="v">',$column,'</td>';
  214. }
  215. echo '</tr>';
  216. }
  217. else { echo '<td class="v">',$value,'</td></tr>'; }
  218. }
  219. echo '</table>';
  220. }
  221. function files_display() {
  222. $status=call_user_func(CACHEPREFIX.'get_status');
  223. if ( empty($status['scripts']) ) {return;}
  224. if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
  225. $time=time(); $sort=0;
  226. $nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  227. $nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  228. $group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;}
  229. $groupset=array_fill(0,9,''); $groupset[$group]=' class="b" ';
  230. echo '<div class="meta">
  231. <a ',$groupset[0],'href="',$nogroup,'">ungroup</a> |
  232. <a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> |
  233. <a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> |
  234. <a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> |
  235. <a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> |
  236. <a ',$groupset[5],'href="',$nogroup,'&GROUP=5">5</a>
  237. </div>';
  238. if ( !$group ) { $files =& $status['scripts']; }
  239. else {
  240. $files=array();
  241. foreach ($status['scripts'] as $data) {
  242. if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) {
  243. if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); }
  244. $files[$path[0]]['full_path']=$path[0];
  245. $files[$path[0]]['files']++;
  246. $files[$path[0]]['memory_consumption']+=$data['memory_consumption'];
  247. $files[$path[0]]['hits']+=$data['hits'];
  248. if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];}
  249. if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];}
  250. }
  251. }
  252. }
  253. if ( !empty($_GET['SORT']) ) {
  254. $keys=array(
  255. 'full_path'=>SORT_STRING,
  256. 'files'=>SORT_NUMERIC,
  257. 'memory_consumption'=>SORT_NUMERIC,
  258. 'hits'=>SORT_NUMERIC,
  259. 'last_used_timestamp'=>SORT_NUMERIC,
  260. 'timestamp'=>SORT_NUMERIC
  261. );
  262. $titles=array('','path',$group?'files':'','size','hits','last used','created');
  263. $offsets=array_keys($keys);
  264. $key=intval($_GET['SORT']);
  265. $direction=$key>0?1:-1;
  266. $key=abs($key)-1;
  267. $key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets);
  268. $sort=array_search($key,$offsets)+1;
  269. $sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
  270. if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
  271. $arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' ▼':' ▲';
  272. $direction=$direction>0?SORT_DESC:SORT_ASC;
  273. $column=array(); foreach ($files as $data) { $column[]=$data[$key]; }
  274. array_multisort($column, $keys[$key], $direction, $files);
  275. }
  276. echo '<table border="0" cellpadding="3" width="960" id="files">
  277. <tr class="h">';
  278. foreach ($titles as $column=>$title) {
  279. if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
  280. }
  281. echo ' </tr>';
  282. foreach ($files as $data) {
  283. echo '<tr>
  284. <td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>',
  285. ($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
  286. '<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
  287. '<td class="vr">',number_format($data['hits']),'</td>',
  288. '<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>',
  289. '<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td>
  290. </tr>';
  291. }
  292. echo '</table>';
  293. }
  294. function graphs_display() {
  295. $graphs=array();
  296. $colors=array('green','brown','red');
  297. $primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
  298. $configuration=call_user_func(CACHEPREFIX.'get_configuration');
  299. $status=call_user_func(CACHEPREFIX.'get_status');
  300. $graphs['memory']['total']=$configuration['directives']['opcache.memory_consumption'];
  301. $graphs['memory']['free']=$status['memory_usage']['free_memory'];
  302. $graphs['memory']['used']=$status['memory_usage']['used_memory'];
  303. $graphs['memory']['wasted']=$status['memory_usage']['wasted_memory'];
  304. $graphs['keys']['total']=$status[CACHEPREFIX.'statistics']['max_cached_keys'];
  305. foreach ($primes as $prime) { if ($prime>=$graphs['keys']['total']) { $graphs['keys']['total']=$prime; break;} }
  306. $graphs['keys']['free']=$graphs['keys']['total']-$status[CACHEPREFIX.'statistics']['num_cached_keys'];
  307. $graphs['keys']['scripts']=$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
  308. $graphs['keys']['wasted']=$status[CACHEPREFIX.'statistics']['num_cached_keys']-$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
  309. $graphs['hits']['total']=0;
  310. $graphs['hits']['hits']=$status[CACHEPREFIX.'statistics']['hits'];
  311. $graphs['hits']['misses']=$status[CACHEPREFIX.'statistics']['misses'];
  312. $graphs['hits']['blacklist']=$status[CACHEPREFIX.'statistics']['blacklist_misses'];
  313. $graphs['hits']['total']=array_sum($graphs['hits']);
  314. $graphs['restarts']['total']=0;
  315. $graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
  316. $graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
  317. $graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
  318. $graphs['restarts']['total']=array_sum($graphs['restarts']);
  319. foreach ( $graphs as $caption=>$graph) {
  320. echo '<div class="graph"><div class="h">',$caption,'</div><table border="0" cellpadding="0" cellspacing="0">';
  321. foreach ($graph as $label=>$value) {
  322. 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;}
  323. $percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%';
  324. 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>';
  325. $key++; $totaldisplay='';
  326. }
  327. echo '</table></div>',"\n";
  328. }
  329. }
  330. function meta_display() {
  331. ?>
  332. <div class="meta">
  333. <a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
  334. <a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
  335. <a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
  336. <a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
  337. <a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
  338. <a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
  339. </div>
  340. <?php
  341. }
 
参考:
CentOS 7.1编译安装PHP7    写的比较好
PHP 7 ,你值得拥有   测试方法
 
原文:
http://blog.csdn.net/21aspnet/article/details/47708763

PHP7和HHVM比较
PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM。HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂了, 并且它不会自动重启。另外它采用JIT, 那么意味着, 重启以后要预热, 没有预热的情况下, 性能较为糟糕。并且多线程模型调试困难, 这对于追求稳定来说的Web服务来说, 是非常不适合的。

Nginx以及PHP7.0之前的版本可以参考此文:Linux环境Nginx安装与调试以及PHP安装

PHP7.0正式版已经在2015年11月份左右发布,目前是PHP7.0.2版本,本人最早是从2015年8月php7的第一个测试版跟起,现在正式版发布。

linux版本:64位CentOS 6.6

Nginx版本:nginx1.8.0

php版本:php-7.0.2

下载

# wget  http://php.net/get/php-7.0.2.tar.gz/from/a/mirror

 
建议安装之前先看看安装帮助文件INSTALL
 
解压安装
# tar zxvf php-7.0.2.tar.gz
# cd php-7.0.2
首先查看安装帮助
# ./configure   --help
# ./configure --prefix=/usr/local/php \
 --with-curl \
 --with-freetype-dir \
 --with-gd \
 --with-gettext \
 --with-iconv-dir \
 --with-kerberos \
 --with-libdir=lib64 \
 --with-libxml-dir \
 --with-mysqli \
 --with-openssl \
 --with-pcre-regex \
 --with-pdo-mysql \
 --with-pdo-sqlite \
 --with-pear \
 --with-png-dir \
 --with-xmlrpc \
 --with-xsl \
 --with-zlib \
 --enable-fpm \
 --enable-bcmath \
 --enable-libxml \
 --enable-inline-optimization \
 --enable-gd-native-ttf \
 --enable-mbregex \
 --enable-mbstring \
 --enable-opcache \
 --enable-pcntl \
 --enable-shmop \
 --enable-soap \
 --enable-sockets \
 --enable-sysvsem \
 --enable-xml \
 --enable-zip

如果配置错误,需要安装需要的模块,直接yum一并安装依赖库

# yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel MySQL pcre-devel

注意:安装php7beta3的时候有几处配置不过去,需要yum一下,现在php-7.0.2已经不用这样了。
# yum -y install curl-devel
# yum -y install libxslt-devel
 
编译安装
# make &&  make install

配置文件
# cp php.ini-development /usr/local/php/lib/php.ini
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# cp -R ./sapi/fpm/php-fpm /etc/init.d/php-fpm
 
需要注意的是php7中www.conf这个配置文件配置phpfpm的端口号等信息,如果你修改默认的9000端口号需在这里改,再改nginx的配置
启动
#  /etc/init.d/php-fpm
 
查看phpinfo()
php7和php5性能分析比较
[php] view plain copy

 

  1. <?php
  2. //time /usr/local/php5/bin/php search_by_key.php
  3. $a = array();
  4. for($i=0;$i<600000;$i++){
  5. $a[$i] = $i;
  6. }
  7. foreach($a as $i)
  8. {
  9. array_key_exists($i, $a);
  10. }
  11. ?>

生成一个 60 万元素的数组,通过查找key 的方式,来确定key是否存在。

PHP 5.4.44 版
[root@localhost www5.4.44]# time /usr/local/php5.4.44/bin/php search_by_key.php

real    0m0.351s
user    0m0.300s
sys     0m0.050s

PHP 5.5.28 版
[root@localhost www]# time /usr/local/php/bin/php search_by_key.php
real    0m0.361s
user    0m0.304s
sys     0m0.057s

PHP 7.0.0 版
[root@localhost www7]# time /usr/local/php7/bin/php search_by_key.php
real    0m0.114s
user    0m0.097s
sys     0m0.017s

 
很明显php7的性能是php5的3倍!
 
配置opcache
官网地址:http://php.net/opcache

使用下列推荐设置来获得较好的 性能:

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.save_comments 并且启用 opcache.enable_file_override。 需要提醒的是,在生产环境中使用上述配置之前,必须经过严格测试。 因为上述配置存在一个已知问题,它会引发一些框架和应用的异常, 尤其是在存在文档使用了备注注解的时候。

 
vim /usr/local/php7/etc/php.ini
# 加入
zend_extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20141001/opcache.so

重启

# killall php-fpm

#  /etc/init.d/php-fpm

 
 
 
如果上图不太明白,可以使用文末Opcache 状态测试代码(https://gist.github.com/ck-on/4959032)进行演示:
 
 
Opcache 状态测试代码(https://gist.github.com/ck-on/4959032)进行演示:
[php] view plain copy

 

  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.6
  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.6 2013-04-12 moved meta to footer so graphs can be higher and reduce clutter
  9. 0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
  10. 0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
  11. 0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
  12. 0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
  13. 0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
  14. 0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
  15. 0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
  16. 0.0.5 2013-03-10 added refresh button (GK)
  17. 0.0.4 2013-02-18 added file grouping and sorting (click on headers) - code needs cleanup but gets the job done
  18. 0.0.2 2013-02-14 first public release
  19. * known problems/limitations:
  20. Unlike APC, the Zend OPcache API
  21. - cannot determine when a file was put into the cache
  22. - cannot change settings on the fly
  23. - cannot protect opcache functions by restricting execution to only specific scripts/paths
  24. * todo:
  25. Extract variables for prefered ordering and better layout instead of just dumping into tables
  26. File list filter
  27. */
  28. // ini_set('display_errors',1); error_reporting(-1);
  29. if ( count(get_included_files())>1 || php_sapi_name()=='cli' || empty($_SERVER['REMOTE_ADDR']) ) { die; } // weak block against indirect access
  30. $time=time();
  31. define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));
  32. if ( !empty($_GET['RESET']) ) {
  33. if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); }
  34. header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
  35. exit;
  36. }
  37. if ( !empty($_GET['RECHECK']) ) {
  38. if ( function_exists(CACHEPREFIX.'invalidate') ) {
  39. $recheck=trim($_GET['RECHECK']); $files=call_user_func(CACHEPREFIX.'get_status');
  40. if (!empty($files['scripts'])) {
  41. foreach ($files['scripts'] as $file=>$value) {
  42. if ( $recheck==='1' || strpos($file,$recheck)===0 ) call_user_func(CACHEPREFIX.'invalidate',$file);
  43. }
  44. }
  45. header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
  46. } else { echo 'Sorry, this feature requires Zend Opcache newer than April 8th 2013'; }
  47. exit;
  48. }
  49. ?><!DOCTYPE html>
  50. <html>
  51. <head>
  52. <title>OCP - Opcache Control Panel</title>
  53. <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />
  54. <style type="text/css">
  55. body {background-color: #fff; color: #000;}
  56. body, td, th, h1, h2 {font-family: sans-serif;}
  57. pre {margin: 0px; font-family: monospace;}
  58. a:link,a:visited {color: #000099; text-decoration: none;}
  59. a:hover {text-decoration: underline;}
  60. table {border-collapse: collapse; width: 600px; }
  61. .center {text-align: center;}
  62. .center table { margin-left: auto; margin-right: auto; text-align: left;}
  63. .center th { text-align: center !important; }
  64. .middle {vertical-align:middle;}
  65. td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline; padding: 3px; }
  66. h1 {font-size: 150%;}
  67. h2 {font-size: 125%;}
  68. .p {text-align: left;}
  69. .e {background-color: #ccccff; font-weight: bold; color: #000; width:50%; white-space:nowrap;}
  70. .h {background-color: #9999cc; font-weight: bold; color: #000;}
  71. .v {background-color: #cccccc; color: #000;}
  72. .vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;}
  73. .b {font-weight:bold;}
  74. .white, .white a {color:#fff;}
  75. img {float: right; border: 0px;}
  76. hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;}
  77. .meta, .small {font-size: 75%; }
  78. .meta {margin: 2em 0;}
  79. .meta a, th a {padding: 10px; white-space:nowrap; }
  80. .buttons {margin:0 0 1em;}
  81. .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;}
  82. #files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
  83. #files td.v a:hover {font-weight:bold; color:#ee0000;}
  84. .graph {display:inline-block; width:145px; margin:1em 0 1em 1px; border:0; vertical-align:top;}
  85. .graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
  86. .graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
  87. .graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
  88. .graph .total {width:34px; text-align:center; padding:0 5px 0 0;}
  89. .graph .total div {border:1px dashed #888; border-right:0; height:99%; width:12px; position:absolute; bottom:0; left:17px; z-index:-1;}
  90. .graph .total span {background:#fff; font-weight:bold;}
  91. .graph .actual {text-align:right; font-weight:bold; padding:0 5px 0 0;}
  92. .graph .red {background:#ee0000;}
  93. .graph .green {background:#00cc00;}
  94. .graph .brown {background:#8B4513;}
  95. </style>
  96. <!--[if lt IE 9]><script type="text/javascript" defer="defer">
  97. 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';}}
  98. </script><![endif]-->
  99. </head>
  100. <body>
  101. <div class="center">
  102. <h1><a href="?">Opcache Control Panel</a></h1>
  103. <div class="buttons">
  104. <a href="?ALL=1">Details</a>
  105. <a href="?FILES=1&GROUP=2&SORT=3">Files</a>
  106. <a href="?RESET=1" onclick="return confirm('RESET cache ?')">Reset</a>
  107. <?php if ( function_exists(CACHEPREFIX.'invalidate') ) { ?>
  108. <a href="?RECHECK=1" onclick="return confirm('Recheck all files in the cache ?')">Recheck</a>
  109. <?php } ?>
  110. <a href="?" onclick="window.location.reload(true); return false">Refresh</a>
  111. </div>
  112. <?php
  113. if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; }
  114. if ( !empty($_GET['FILES']) ) { echo '<h2>files cached</h2>'; files_display(); echo '</div></body></html>'; exit; }
  115. if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { exit; } }
  116. 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
  117. if ( !preg_match( '/module\_Zend (Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $opcache) ) { } // todo
  118. if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); }
  119. $host=function_exists('gethostname')?@gethostname():@php_uname('n'); if (empty($host)) { $host=empty($_SERVER['SERVER_NAME'])?$_SERVER['HOST_NAME']:$_SERVER['SERVER_NAME']; }
  120. $version=array('Host'=>$host);
  121. $version['PHP Version']='PHP '.(defined('PHP_VERSION')?PHP_VERSION:'???').' '.(defined('PHP_SAPI')?PHP_SAPI:'').' '.(defined('PHP_OS')?' '.PHP_OS:'');
  122. $version['Opcache Version']=empty($configuration['version']['version'])?'???':$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version'];
  123. print_table($version);
  124. if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); }
  125. if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) {
  126. $uptime=array();
  127. if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
  128. $uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
  129. }
  130. if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
  131. $uptime['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
  132. }
  133. if (!empty($uptime)) {print_table($uptime);}
  134. if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; }
  135. echo '<h2 id="memory">memory</h2>';
  136. print_table($status['memory_usage']);
  137. unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
  138. echo '<h2 id="statistics">statistics</h2>';
  139. print_table($status[CACHEPREFIX.'statistics']);
  140. }
  141. if ( empty($_GET['ALL']) ) { meta_display(); exit; }
  142. if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); }
  143. if ( !empty($opcache[3]) ) { echo '<h2 id="runtime">runtime</h2>'; echo $opcache[3]; }
  144. $name='zend opcache'; $functions=get_extension_funcs($name);
  145. if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); }
  146. if ($functions) { echo '<h2 id="functions">functions</h2>'; print_table($functions); } else { $name=''; }
  147. $level=trim(CACHEPREFIX,'_').'.optimization_level';
  148. if (isset($configuration['directives'][$level])) {
  149. echo '<h2 id="optimization">optimization levels</h2>';
  150. $levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
  151. $levels=array(
  152. 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>',
  153. 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>',
  154. 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>',
  155. 4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)',
  156. 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)',
  157. 9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)',
  158. 10=>'Remove NOPs'
  159. );
  160. echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>';
  161. foreach ($levels as $pass=>$description) {
  162. $disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':'';
  163. echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>';
  164. }
  165. echo '</table>';
  166. }
  167. if ( isset($_GET['DUMP']) ) {
  168. if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); }
  169. foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
  170. exit;
  171. }
  172. meta_display();
  173. echo '</div></body></html>';
  174. exit;
  175. function time_since($time,$original,$extended=0,$text='ago') {
  176. $time = $time - $original;
  177. $day = $extended? floor($time/86400) : round($time/86400,0);
  178. $amount=0; $unit='';
  179. if ( $time < 86400) {
  180. if ( $time < 60) { $amount=$time; $unit='second'; }
  181. elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
  182. else    { $amount=floor($time/3600); $unit='hour'; }
  183. }
  184. elseif ( $day < 14) { $amount=$day; $unit='day'; }
  185. elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; }
  186. elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
  187. else {  $amount=intval(2*($day/365))/2; $unit='year'; }
  188. if ( $amount!=1) {$unit.='s';}
  189. if ($extended && $time>60) { $text=' and '.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,'').$text; }
  190. return $amount.' '.$unit.' '.$text;
  191. }
  192. function print_table($array,$headers=false) {
  193. if ( empty($array) || !is_array($array) ) {return;}
  194. echo '<table border="0" cellpadding="3" width="600">';
  195. if (!empty($headers)) {
  196. if (!is_array($headers)) {$headers=array_keys(reset($array));}
  197. echo '<tr class="h">';
  198. foreach ($headers as $value) { echo '<th>',$value,'</th>'; }
  199. echo '</tr>';
  200. }
  201. foreach ($array as $key=>$value) {
  202. echo '<tr>';
  203. if ( !is_numeric($key) ) {
  204. $key=ucwords(str_replace('_',' ',$key));
  205. echo '<td class="e">',$key,'</td>';
  206. if ( is_numeric($value) ) {
  207. if ( $value>1048576) { $value=round($value/1048576,1).'M'; }
  208. elseif ( is_float($value) ) { $value=round($value,1); }
  209. }
  210. }
  211. if ( is_array($value) ) {
  212. foreach ($value as $column) {
  213. echo '<td class="v">',$column,'</td>';
  214. }
  215. echo '</tr>';
  216. }
  217. else { echo '<td class="v">',$value,'</td></tr>'; }
  218. }
  219. echo '</table>';
  220. }
  221. function files_display() {
  222. $status=call_user_func(CACHEPREFIX.'get_status');
  223. if ( empty($status['scripts']) ) {return;}
  224. if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
  225. $time=time(); $sort=0;
  226. $nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  227. $nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
  228. $group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;}
  229. $groupset=array_fill(0,9,''); $groupset[$group]=' class="b" ';
  230. echo '<div class="meta">
  231. <a ',$groupset[0],'href="',$nogroup,'">ungroup</a> |
  232. <a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> |
  233. <a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> |
  234. <a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> |
  235. <a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> |
  236. <a ',$groupset[5],'href="',$nogroup,'&GROUP=5">5</a>
  237. </div>';
  238. if ( !$group ) { $files =& $status['scripts']; }
  239. else {
  240. $files=array();
  241. foreach ($status['scripts'] as $data) {
  242. if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) {
  243. if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); }
  244. $files[$path[0]]['full_path']=$path[0];
  245. $files[$path[0]]['files']++;
  246. $files[$path[0]]['memory_consumption']+=$data['memory_consumption'];
  247. $files[$path[0]]['hits']+=$data['hits'];
  248. if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];}
  249. if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];}
  250. }
  251. }
  252. }
  253. if ( !empty($_GET['SORT']) ) {
  254. $keys=array(
  255. 'full_path'=>SORT_STRING,
  256. 'files'=>SORT_NUMERIC,
  257. 'memory_consumption'=>SORT_NUMERIC,
  258. 'hits'=>SORT_NUMERIC,
  259. 'last_used_timestamp'=>SORT_NUMERIC,
  260. 'timestamp'=>SORT_NUMERIC
  261. );
  262. $titles=array('','path',$group?'files':'','size','hits','last used','created');
  263. $offsets=array_keys($keys);
  264. $key=intval($_GET['SORT']);
  265. $direction=$key>0?1:-1;
  266. $key=abs($key)-1;
  267. $key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets);
  268. $sort=array_search($key,$offsets)+1;
  269. $sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
  270. if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
  271. $arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' ▼':' ▲';
  272. $direction=$direction>0?SORT_DESC:SORT_ASC;
  273. $column=array(); foreach ($files as $data) { $column[]=$data[$key]; }
  274. array_multisort($column, $keys[$key], $direction, $files);
  275. }
  276. echo '<table border="0" cellpadding="3" width="960" id="files">
  277. <tr class="h">';
  278. foreach ($titles as $column=>$title) {
  279. if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
  280. }
  281. echo ' </tr>';
  282. foreach ($files as $data) {
  283. echo '<tr>
  284. <td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>',
  285. ($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
  286. '<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
  287. '<td class="vr">',number_format($data['hits']),'</td>',
  288. '<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>',
  289. '<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td>
  290. </tr>';
  291. }
  292. echo '</table>';
  293. }
  294. function graphs_display() {
  295. $graphs=array();
  296. $colors=array('green','brown','red');
  297. $primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
  298. $configuration=call_user_func(CACHEPREFIX.'get_configuration');
  299. $status=call_user_func(CACHEPREFIX.'get_status');
  300. $graphs['memory']['total']=$configuration['directives']['opcache.memory_consumption'];
  301. $graphs['memory']['free']=$status['memory_usage']['free_memory'];
  302. $graphs['memory']['used']=$status['memory_usage']['used_memory'];
  303. $graphs['memory']['wasted']=$status['memory_usage']['wasted_memory'];
  304. $graphs['keys']['total']=$status[CACHEPREFIX.'statistics']['max_cached_keys'];
  305. foreach ($primes as $prime) { if ($prime>=$graphs['keys']['total']) { $graphs['keys']['total']=$prime; break;} }
  306. $graphs['keys']['free']=$graphs['keys']['total']-$status[CACHEPREFIX.'statistics']['num_cached_keys'];
  307. $graphs['keys']['scripts']=$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
  308. $graphs['keys']['wasted']=$status[CACHEPREFIX.'statistics']['num_cached_keys']-$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
  309. $graphs['hits']['total']=0;
  310. $graphs['hits']['hits']=$status[CACHEPREFIX.'statistics']['hits'];
  311. $graphs['hits']['misses']=$status[CACHEPREFIX.'statistics']['misses'];
  312. $graphs['hits']['blacklist']=$status[CACHEPREFIX.'statistics']['blacklist_misses'];
  313. $graphs['hits']['total']=array_sum($graphs['hits']);
  314. $graphs['restarts']['total']=0;
  315. $graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
  316. $graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
  317. $graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
  318. $graphs['restarts']['total']=array_sum($graphs['restarts']);
  319. foreach ( $graphs as $caption=>$graph) {
  320. echo '<div class="graph"><div class="h">',$caption,'</div><table border="0" cellpadding="0" cellspacing="0">';
  321. foreach ($graph as $label=>$value) {
  322. 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;}
  323. $percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%';
  324. 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>';
  325. $key++; $totaldisplay='';
  326. }
  327. echo '</table></div>',"\n";
  328. }
  329. }
  330. function meta_display() {
  331. ?>
  332. <div class="meta">
  333. <a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
  334. <a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
  335. <a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
  336. <a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
  337. <a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
  338. <a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
  339. </div>
  340. <?php
  341. }
 
 
参考:
CentOS 7.1编译安装PHP7    写的比较好
PHP 7 ,你值得拥有   测试方法
 
 

Linux环境PHP7.0.2安装的更多相关文章

  1. Linux环境PHP7.0安装

    原文地址:http://blog.csdn.net/21aspnet/article/details/47708763 PHP7和HHVM比较 PHP7的在真实场景的性能确实已经和HHVM相当, 在一 ...

  2. inux环境PHP7.0安装

    inux环境PHP7.0安装   PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导 ...

  3. Linux环境下NodeJS的安装配置(HelloWorld)

    Linux环境下NodeJS的安装配置(HelloWorld) 最简单的环境安装,测试helloworld.给初学者!! 安装脚本,请仔细阅读逐行执行: #!/bin/bash #检查是否已经安装 r ...

  4. Linux环境下MySQL5.7安装记录

    参考文档 <Installing MySQL on Unix/Linux Using Generic Binaries> https://dev.mysql.com/doc/refman/ ...

  5. (Linux环境Kafka集群安装配置及常用命令

    Linux环境Kafka集群安装配置及常用命令 Kafka 消息队列内部实现原理 Kafka架构 一.下载Kafka安装包 二.Kafka安装包的解压 三.设置环境变量 四.配置kafka文件 4.1 ...

  6. Linux环境下Python的安装过程

    Linux环境下Python的安装过程 前言 一般情况下,Linux都会预装 Python了,但是这个预装的Python版本一般都非常低,很多 Python的新特性都没有,必须重新安装新一点的版本,从 ...

  7. Linux环境下使用yum安装zip和unzip

    Linux环境下使用yum安装zip和unzip. yum install zip yum install unzip

  8. PCL库在Linux环境下的编译安装

    PCL库在Linux环境下的编译安装 PCL库的源码库:https://github.com/PointCloudLibrary/pcl 下载完了之后解压下来 编译库的几个步骤 mkdir build ...

  9. 【Linux】CentOS7.0下安装JDK环境

    写在前面:此次试验是在CentOS7上面安装的,亲测成功. 所需工具:JDK1.8安装包,xftp 具体步骤: 1,首先使用xftp连接到自己的虚拟机,然后查看是否有"/usr/java/j ...

随机推荐

  1. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  2. sql删除数据库所有表

    use 数据库名(是要删除表的所在的那个数据库的名称) GO ) begin SELECT @sql='drop table ' + name FROM sysobjects WHERE (type ...

  3. Android Bluetooth模块学习笔记

    一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段: ...

  4. python3.X中简单错误处理,和Python2区别

    1.print 1.1 Print是一个函数 在Python3中print是个函数,这意味着在使用的时候必须带上小括号,并且它是带有参数的. >>> print 'hello wor ...

  5. Android API之onLayout, onMeasure

    android.view.ViewGroup protected void onLayout(boolean changed, int l, int t, int r, int b) 执行layout ...

  6. Zookeeper研究和应用

    http://www.searchtb.com/2011/01/zookeeper-research.html zookeeper简介 zookeeper是一个开源分布式的服务,它提供了分布式协作,分 ...

  7. js同域名下不同文件下使用coookie

    //写cookies function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.get ...

  8. 用ASP.NET/C#连接Access和SQL Server数据库

    连接Access 首先看一个例子代码片断:程序代码: ------------------------------------------------------------------------- ...

  9. python None 和 NaN

    python原生的None和pandas, numpy中的numpy.NaN尽管在功能上都是用来标示空缺数据.但它们的行为在很多场景下确有一些相当大的差异.由于不熟悉这些差异,曾经给我的工作带来过不少 ...

  10. 会话过程保存数据对象cookie和session

    1 cookie是以键值对保存在浏览器端,服务器端可以创建.接收.发送 cookie 信息. request可以接收 cookie, response 可以发送 cookie. 1)cookie 可以 ...