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. 魔术布局效果-使用本地JSON数据提供数据服务

    在线演示 有社区朋友不知道如何修改外部OpenAPI为本地的JSON服务,这里做一个简单演示. 阅读原文:魔术布局效果-使用本地JSON数据提供数据服务

  2. Python网络爬虫 - 一个简单的爬虫例子

    下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request import urlopen f ...

  3. PHP 5 Math函数

    PHP 5 Math 函数 PHP Math 简介 Math 函数能处理 integer 和 float 范围内的值. 安装 PHP Math 函数是 PHP 核心的组成部分.无需安装即可使用这些函数 ...

  4. DB中耗时的 存储过程 及执行详细情况

    SELECT a.object_id, a.database_id, OBJECT_NAME(object_id, database_id) 'proc name', a.cached_time, a ...

  5. win7编程接口的一些变化

    原文链接:http://www.nirsoft.net/articles/windows_7_kernel_architecture_changes.html Windows 7 introduces ...

  6. 【linux】FTP添加用户,设置权限和目录

    一.目的,新建一个用户 test2,登录ftp,它只有自己的主目录权限,其他同级和上级目录没有权限 二.ftp安装.配置 yum -y install vsftpd //通过yum来安装vsftpd ...

  7. Django的CBV与FBV

    FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class base v ...

  8. android多线程进度条

    多线程实现更新android进度条. 实例教程,详细信息我已经注释   android多线程进度条   01package com.shougao.hello; 02 03import android ...

  9. DirectX.DirectSound声音播放资料

    参考:https://msdn.microsoft.com/en-us/library/windows/desktop/bb318665(v=vs.85).aspx Microsoft DirectS ...

  10. mosquitto --用户配置 及权限管理

    mosquitto中可以添加多个用户,只有使用用户名和密码登陆服务器才允许用户进行订阅与发布操作.可以说用户机制是mosquitto重要的安全机制,增强服务器的安全性.用户与权限配置需要修改3处地方: ...