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. (剑指Offer)面试题54:表示数值的字符串

    题目: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.14 ...

  2. Bootstrap3.1开发的响应式个人简历模板

    在线演示 使用bootstrap3快速开发一个响应式的个人简历,如果有兴趣了解如何开发,请访问GB课程库,地址如下: Bootstrap3构建响应式前端设计师简历模板 http://www.gbtag ...

  3. C#获取外网IP地址;C#获取所在IP城市地址

    public static string GetIP()         {             using (var webClient = new WebClient())           ...

  4. Android之GPS定位详解

    一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个LocationManager.我们可以通过如下代码创建LocationManger ...

  5. 算法笔记_019:背包问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 递归求解 2.2.2 非递归求解(运用异或运算) 2.3 动态规划法 1 问题描述 给定n个重量为w1,w2,w3,... ...

  6. webpack CommonsChunkPlugin 提取公共代码

    1.项目结构 2.部分代码 module.js console.log('module.js'); index文件夹下的index.js require('../module.js'); consol ...

  7. test推荐到极客头条002

    test推荐到极客头条002test推荐到极客头条002test推荐到极客头条002test推荐到极客头条002test推荐到极客头条002test推荐到极客头条002test推荐到极客头条002te ...

  8. linux配置java环境变量(详细) [转]

    一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车, ...

  9. ASP.NET给DataGrid,Repeater等添加全选批量删除等功能

    很多情况下,在管理或者查看列表的时候我们需要很需要“全选”这个功能,这在ASP.NET中是非常容易实现的,下面我就将演示一点小代码实现这一功能.   实现全选的还是js的一个小函数:   [code] ...

  10. C++模板类内友元(友元函数,友元类)声明的三种情况

    根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{     void bar(); ...