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. 使用js的indexOf,lastIndexOf,slice三函数轻易得到url的服务器,路径和页名

    js的indexOf,lastIndexOf,slice能帮我们在js字符串处理时少走一些弯路. 程序如下: var url="http://www.cnblogs.com/xiandeda ...

  2. Android Activity的生命周期的几个方法介绍

    onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态. onStart():Activity在屏幕上对用户可见时调用 on ...

  3. WCF 之 已知类型(KnownType)

    已知类型(Known types)允许在服务契约中使用多态的行为,在服务操作中暴露基本类型.将已知类型(known types)相关到基本类型(基类类型)自身;特定操作;整个服务契约采用属性声明或者配 ...

  4. Git学习笔记五--分支管理

    为什么要引入分支? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了.如果等代码全部 ...

  5. Linux环境下GNU, GCC, G++编译器(转)

    一,GNU GNU是“GNU 's Not Unix”的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new ...

  6. 基于Unity3D云人脸监測技术

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师.CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  7. 编程算法 - 翻转单词顺序 代码(C)

    翻转单词顺序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个英文句子, 翻转句子中单词的顺序, 但单词内字符的顺序不变. 首先翻转(r ...

  8. weblogic设置jvm参数

    http://www.quiee.com.cn/archives/592/ weblogic a) 编辑Weblogic Server启动脚本文件:BEA_HOME\user_projects\dom ...

  9. C# 中运行exe程序

    private int runProcess(string fileName, string appParam) { int returnValue = -1; try { Process myPro ...

  10. 在文件夹右键菜单里添加“DOS 到这里”这个菜单项

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd]@="DO ...