Home  >  Article  >  Backend Development  >  PHP7.0 installation example in Linux environment

PHP7.0 installation example in Linux environment

小云云
小云云Original
2018-03-30 15:06:341512browse

PHP7's performance in real scenarios is indeed comparable to HHVM, and even exceeds HHVM in some scenarios. The operation and maintenance of HHVM is complex and it is a multi-threaded model. This means that if a thread causes a crash, the entire service will hang and it will not automatically restart. In addition, it uses JIT, which means that it needs to be warmed up after restarting. Without preheating, the performance will be worse. Moreover, the multi-threaded model is difficult to debug, which is very unsuitable for web services that pursue stability.

For versions before Nginx and PHP7.0, please refer to this article: Linux environment Nginx installation and debugging and PHP installation

The official version of PHP7.0 has been released around November 2015, and is currently PHP7.0.2 version, I first started following the first beta version of php7 in August 2015, and now the official version is released.

linux version: 64-bit CentOS 6.6

Nginx version: nginx1.8.0

php version: php-7.0.2

Download

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

It is recommended to read the installation help file INSTALL

## before installation. #Unzip and install

# tar zxvf php-7.0.2.tar.gz

# cd php-7.0.2

First check the installation help

# ./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

If the configuration is wrong, you need to install the required modules and install the dependent libraries directly with yum

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

Note: There are several configurations that cannot be configured when installing php7beta3. You need to yum it. This is no longer the case with php-7.0.2.

# yum -y install curl-devel

# yum -y install libxslt-devel

Compile and install

# make && make install



Configuration file

# 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

It should be noted that the www.conf configuration file in php7 configures the port number and other information of phpfpm. If you modify the default 9000 port number, you need to change it here, and then change the nginx configuration

Start

# /etc/init.d/php-fpm

View phpinfo()



Comparison of performance analysis of php7 and php5

<?php
//time /usr/local/php5/bin/php search_by_key.php
$a = array();
    for($i=0;$i<600000;$i++){
        $a[$i] = $i;
        }

    foreach($a as $i)
    {
        array_key_exists($i, $a);
    }
?>

Generate an array of 600,000 elements, and determine whether the key exists by searching for the key.



PHP version 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 version 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 version 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

Obviously the performance of php7 is php5 3 times!

Configuring opcache

Official website address: http://php.net/opcache

Use the following recommended settings to get better performance:

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
/*
OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
Author: _ck_ (with contributions by GK, stasilok)
Version: 0.1.6
Free for any kind of use or modification, I am not responsible for anything, please share your improvements
 
* revision history
0.1.6 2013-04-12 moved meta to footer so graphs can be higher and reduce clutter
0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
0.0.5 2013-03-10 added refresh button (GK)
0.0.4 2013-02-18 added file grouping and sorting (click on headers) - code needs cleanup but gets the job done
0.0.2 2013-02-14 first public release
 
* known problems/limitations:
Unlike APC, the Zend OPcache API
- cannot determine when a file was put into the cache
- cannot change settings on the fly
- cannot protect opcache functions by restricting execution to only specific scripts/paths
 
* todo:
Extract variables for prefered ordering and better layout instead of just dumping into tables
File list filter
 
*/
 
// ini_set(&#39;display_errors&#39;,1); error_reporting(-1);
if ( count(get_included_files())>1 || php_sapi_name()==&#39;cli&#39; || empty($_SERVER[&#39;REMOTE_ADDR&#39;]) ) { die; } // weak block against indirect access
 
$time=time();
define(&#39;CACHEPREFIX&#39;,function_exists(&#39;opcache_reset&#39;)?&#39;opcache_&#39;:(function_exists(&#39;accelerator_reset&#39;)?&#39;accelerator_&#39;:&#39;&#39;));
 
if ( !empty($_GET[&#39;RESET&#39;]) ) {	
if ( function_exists(CACHEPREFIX.&#39;reset&#39;) ) { call_user_func(CACHEPREFIX.&#39;reset&#39;); }
header( &#39;Location: &#39;.str_replace(&#39;?&#39;.$_SERVER[&#39;QUERY_STRING&#39;],&#39;&#39;,$_SERVER[&#39;REQUEST_URI&#39;]) );
exit;
}
 
if ( !empty($_GET[&#39;RECHECK&#39;]) ) {
if ( function_exists(CACHEPREFIX.&#39;invalidate&#39;) ) {
$recheck=trim($_GET[&#39;RECHECK&#39;]); $files=call_user_func(CACHEPREFIX.&#39;get_status&#39;);
if (!empty($files[&#39;scripts&#39;])) {
foreach ($files[&#39;scripts&#39;] as $file=>$value) {
if ( $recheck===&#39;1&#39; || strpos($file,$recheck)===0 ) call_user_func(CACHEPREFIX.&#39;invalidate&#39;,$file);
}
}
header( &#39;Location: &#39;.str_replace(&#39;?&#39;.$_SERVER[&#39;QUERY_STRING&#39;],&#39;&#39;,$_SERVER[&#39;REQUEST_URI&#39;]) );
} else { echo &#39;Sorry, this feature requires Zend Opcache newer than April 8th 2013&#39;; }
exit;
}
 
?><!DOCTYPE html>
<html>
<head>
<title>OCP - Opcache Control Panel</title>
<meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />
 
<style type="text/css">
body {background-color: #fff; color: #000;}
body, td, th, h1, h2 {font-family: sans-serif;}
pre {margin: 0px; font-family: monospace;}
a:link,a:visited {color: #000099; text-decoration: none;}
a:hover {text-decoration: underline;}
table {border-collapse: collapse; width: 600px; }
.center {text-align: center;}
.center table { margin-left: auto; margin-right: auto; text-align: left;}
.center th { text-align: center !important; }
.middle {vertical-align:middle;}
td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline; padding: 3px; }
h1 {font-size: 150%;}
h2 {font-size: 125%;}
.p {text-align: left;}
.e {background-color: #ccccff; font-weight: bold; color: #000; width:50%; white-space:nowrap;}
.h {background-color: #9999cc; font-weight: bold; color: #000;}
.v {background-color: #cccccc; color: #000;}
.vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;}
.b {font-weight:bold;}
.white, .white a {color:#fff;}
img {float: right; border: 0px;}
hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;}
.meta, .small {font-size: 75%; }
.meta {margin: 2em 0;}
.meta a, th a {padding: 10px; white-space:nowrap; }
.buttons {margin:0 0 1em;}
.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;}
#files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
#files td.v a:hover {font-weight:bold; color:#ee0000;}
.graph {display:inline-block; width:145px; margin:1em 0 1em 1px; border:0; vertical-align:top;}
.graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
.graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
.graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
.graph .total {width:34px; text-align:center; padding:0 5px 0 0;}
.graph .total p {border:1px dashed #888; border-right:0; height:99%; width:12px; position:absolute; bottom:0; left:17px; z-index:-1;}
.graph .total span {background:#fff; font-weight:bold;}
.graph .actual {text-align:right; font-weight:bold; padding:0 5px 0 0;}
.graph .red {background:#ee0000;}
.graph .green {background:#00cc00;}
.graph .brown {background:#8B4513;}
</style>
<!--[if lt IE 9]><script type="text/javascript" defer="defer">
window.onload=function(){var i,t=document.getElementsByTagName(&#39;table&#39;);for(i=0;i<t.length;i++){if(t[i].parentNode.className==&#39;graph&#39;)t[i].style.height=150-(t[i].clientHeight-150)+&#39;px&#39;;}}
</script><![endif]-->
</head>
 
<body>
<p class="center">
 
<h1><a href="?">Opcache Control Panel</a></h1>
 
<p class="buttons">
<a href="?ALL=1">Details</a>
<a href="?FILES=1&GROUP=2&SORT=3">Files</a>
<a href="?RESET=1" onclick="return confirm(&#39;RESET cache ?&#39;)">Reset</a>
<?php if ( function_exists(CACHEPREFIX.&#39;invalidate&#39;) ) { ?>
<a href="?RECHECK=1" onclick="return confirm(&#39;Recheck all files in the cache ?&#39;)">Recheck</a>
<?php } ?>
<a href="?" onclick="window.location.reload(true); return false">Refresh</a>
</p>
 
<?php
 
if ( !function_exists(CACHEPREFIX.&#39;get_status&#39;) ) { echo &#39;<h2>Opcache not detected?</h2>&#39;; die; }
 
if ( !empty($_GET[&#39;FILES&#39;]) ) { echo &#39;<h2>files cached</h2>&#39;; files_display(); echo &#39;</p></body></html>&#39;; exit; }
 
if ( !(isset($_REQUEST[&#39;GRAPHS&#39;]) && !$_REQUEST[&#39;GRAPHS&#39;]) && CACHEPREFIX==&#39;opcache_&#39;) { graphs_display(); if ( !empty($_REQUEST[&#39;GRAPHS&#39;]) ) { exit; } }
 
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
if ( !preg_match( &#39;/module\_Zend (Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s&#39;, $phpinfo, $opcache) ) { } // todo
 
if ( function_exists(CACHEPREFIX.&#39;get_configuration&#39;) ) { echo &#39;<h2>general</h2>&#39;; $configuration=call_user_func(CACHEPREFIX.&#39;get_configuration&#39;); }
 
$host=function_exists(&#39;gethostname&#39;)?@gethostname():@php_uname(&#39;n&#39;); if (empty($host)) { $host=empty($_SERVER[&#39;SERVER_NAME&#39;])?$_SERVER[&#39;HOST_NAME&#39;]:$_SERVER[&#39;SERVER_NAME&#39;]; }
$version=array(&#39;Host&#39;=>$host);
$version[&#39;PHP Version&#39;]=&#39;PHP &#39;.(defined(&#39;PHP_VERSION&#39;)?PHP_VERSION:&#39;???&#39;).&#39; &#39;.(defined(&#39;PHP_SAPI&#39;)?PHP_SAPI:&#39;&#39;).&#39; &#39;.(defined(&#39;PHP_OS&#39;)?&#39; &#39;.PHP_OS:&#39;&#39;);
$version[&#39;Opcache Version&#39;]=empty($configuration[&#39;version&#39;][&#39;version&#39;])?&#39;???&#39;:$configuration[&#39;version&#39;][CACHEPREFIX.&#39;product_name&#39;].&#39; &#39;.$configuration[&#39;version&#39;][&#39;version&#39;];
print_table($version);
 
if ( !empty($opcache[2]) ) { echo preg_replace(&#39;/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/&#39;,&#39;&#39;,$opcache[2]); }
 
if ( function_exists(CACHEPREFIX.&#39;get_status&#39;) && $status=call_user_func(CACHEPREFIX.&#39;get_status&#39;) ) {
$uptime=array();
if ( !empty($status[CACHEPREFIX.&#39;statistics&#39;][&#39;start_time&#39;]) ) {
$uptime[&#39;uptime&#39;]=time_since($time,$status[CACHEPREFIX.&#39;statistics&#39;][&#39;start_time&#39;],1,&#39;&#39;);
}
if ( !empty($status[CACHEPREFIX.&#39;statistics&#39;][&#39;last_restart_time&#39;]) ) {
$uptime[&#39;last_restart&#39;]=time_since($time,$status[CACHEPREFIX.&#39;statistics&#39;][&#39;last_restart_time&#39;]);
}
if (!empty($uptime)) {print_table($uptime);}
if ( !empty($status[&#39;cache_full&#39;]) ) { $status[&#39;memory_usage&#39;][&#39;cache_full&#39;]=$status[&#39;cache_full&#39;]; }
echo &#39;<h2 id="memory">memory</h2>&#39;;
print_table($status[&#39;memory_usage&#39;]);
unset($status[CACHEPREFIX.&#39;statistics&#39;][&#39;start_time&#39;],$status[CACHEPREFIX.&#39;statistics&#39;][&#39;last_restart_time&#39;]);
echo &#39;<h2 id="statistics">statistics</h2>&#39;;
print_table($status[CACHEPREFIX.&#39;statistics&#39;]);
}
 
if ( empty($_GET[&#39;ALL&#39;]) ) { meta_display(); exit; }
if ( !empty($configuration[&#39;blacklist&#39;]) ) { echo &#39;<h2 id="blacklist">blacklist</h2>&#39;; print_table($configuration[&#39;blacklist&#39;]); }
 
if ( !empty($opcache[3]) ) { echo &#39;<h2 id="runtime">runtime</h2>&#39;; echo $opcache[3]; }
 
$name=&#39;zend opcache&#39;; $functions=get_extension_funcs($name);
if (!$functions) { $name=&#39;zend optimizer+&#39;; $functions=get_extension_funcs($name); }
if ($functions) { echo &#39;<h2 id="functions">functions</h2>&#39;; print_table($functions); } else { $name=&#39;&#39;; }
 
$level=trim(CACHEPREFIX,&#39;_&#39;).&#39;.optimization_level&#39;;
if (isset($configuration[&#39;directives&#39;][$level])) {
echo &#39;<h2 id="optimization">optimization levels</h2>&#39;;	
$levelset=strrev(base_convert($configuration[&#39;directives&#39;][$level], 10, 2));
$levels=array(
1=>&#39;<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>&#39;,
2=>&#39;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>&#39;,
3=>&#39;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>&#39;,
4=>&#39;PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)&#39;,
5=>&#39;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)&#39;,
9=>&#39;Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)&#39;,
10=>&#39;Remove NOPs&#39;
);
echo &#39;<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>&#39;;
foreach ($levels as $pass=>$description) {
$disabled=substr($levelset,$pass-1,1)!==&#39;1&#39; || $pass==4 ? &#39; white&#39;:&#39;&#39;;
echo &#39;<tr><td class="v center middle&#39;.$disabled.&#39;">&#39;.$pass.&#39;</td><td class="v&#39;.$disabled.&#39;">&#39;.$description.&#39;</td></tr>&#39;;
}
echo &#39;</table>&#39;;
}
 
if ( isset($_GET[&#39;DUMP&#39;]) ) {
if ($name) { echo &#39;<h2 id="ini">ini</h2>&#39;; print_table(ini_get_all($name,true)); }
foreach ($configuration as $key=>$value) { echo &#39;<h2>&#39;,$key,&#39;</h2>&#39;; print_table($configuration[$key]); }
exit;
}
 
meta_display();
 
echo &#39;</p></body></html>&#39;;
 
exit;
 
function time_since($time,$original,$extended=0,$text=&#39;ago&#39;) {	
$time = $time - $original;
$day = $extended? floor($time/86400) : round($time/86400,0);
$amount=0; $unit=&#39;&#39;;
if ( $time < 86400) {
if ( $time < 60)	{ $amount=$time; $unit=&#39;second&#39;; }
elseif ( $time < 3600) { $amount=floor($time/60); $unit=&#39;minute&#39;; }
else	{ $amount=floor($time/3600); $unit=&#39;hour&#39;; }	
}
elseif ( $day < 14) { $amount=$day; $unit=&#39;day&#39;; }
elseif ( $day < 56) { $amount=floor($day/7); $unit=&#39;week&#39;; }
elseif ( $day < 672) { $amount=floor($day/30); $unit=&#39;month&#39;; }
else {	$amount=intval(2*($day/365))/2; $unit=&#39;year&#39;; }
if ( $amount!=1) {$unit.=&#39;s&#39;;}	
if ($extended && $time>60) { $text=&#39; and &#39;.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,&#39;&#39;).$text; }
return $amount.&#39; &#39;.$unit.&#39; &#39;.$text;
}
 
function print_table($array,$headers=false) {
if ( empty($array) || !is_array($array) ) {return;}
echo &#39;<table border="0" cellpadding="3" width="600">&#39;;
if (!empty($headers)) {
if (!is_array($headers)) {$headers=array_keys(reset($array));}
echo &#39;<tr class="h">&#39;;
foreach ($headers as $value) { echo &#39;<th>&#39;,$value,&#39;</th>&#39;; }
echo &#39;</tr>&#39;;
}
foreach ($array as $key=>$value) {
echo &#39;<tr>&#39;;
if ( !is_numeric($key) ) {
$key=ucwords(str_replace(&#39;_&#39;,&#39; &#39;,$key));
echo &#39;<td class="e">&#39;,$key,&#39;</td>&#39;;
if ( is_numeric($value) ) {
if ( $value>1048576) { $value=round($value/1048576,1).&#39;M&#39;; }
elseif ( is_float($value) ) { $value=round($value,1); }
}
}
if ( is_array($value) ) {
foreach ($value as $column) {
echo &#39;<td class="v">&#39;,$column,&#39;</td>&#39;;
}
echo &#39;</tr>&#39;;
}
else { echo &#39;<td class="v">&#39;,$value,&#39;</td></tr>&#39;; }
}
echo &#39;</table>&#39;;
}
 
function files_display() {	
$status=call_user_func(CACHEPREFIX.&#39;get_status&#39;);
if ( empty($status[&#39;scripts&#39;]) ) {return;}
if ( isset($_GET[&#39;DUMP&#39;]) ) { print_table($status[&#39;scripts&#39;]); exit;}
$time=time(); $sort=0;
$nogroup=preg_replace(&#39;/\&?GROUP\=[\-0-9]+/&#39;,&#39;&#39;,$_SERVER[&#39;REQUEST_URI&#39;]);
$nosort=preg_replace(&#39;/\&?SORT\=[\-0-9]+/&#39;,&#39;&#39;,$_SERVER[&#39;REQUEST_URI&#39;]);
$group=empty($_GET[&#39;GROUP&#39;])?0:intval($_GET[&#39;GROUP&#39;]); if ( $group<0 || $group>9) { $group=1;}
$groupset=array_fill(0,9,&#39;&#39;); $groupset[$group]=&#39; class="b" &#39;;
echo &#39;<p class="meta">
<a &#39;,$groupset[0],&#39;href="&#39;,$nogroup,&#39;">ungroup</a> |
<a &#39;,$groupset[1],&#39;href="&#39;,$nogroup,&#39;&GROUP=1">1</a> |
<a &#39;,$groupset[2],&#39;href="&#39;,$nogroup,&#39;&GROUP=2">2</a> |
<a &#39;,$groupset[3],&#39;href="&#39;,$nogroup,&#39;&GROUP=3">3</a> |
<a &#39;,$groupset[4],&#39;href="&#39;,$nogroup,&#39;&GROUP=4">4</a> |
<a &#39;,$groupset[5],&#39;href="&#39;,$nogroup,&#39;&GROUP=5">5</a>
</p>&#39;;
if ( !$group ) { $files =& $status[&#39;scripts&#39;]; }
else {	
$files=array();
foreach ($status[&#39;scripts&#39;] as $data) {
if ( preg_match(&#39;@^[/]([^/]+[/]){&#39;.$group.&#39;}@&#39;,$data[&#39;full_path&#39;],$path) ) {
if ( empty($files[$path[0]])) { $files[$path[0]]=array(&#39;full_path&#39;=>&#39;&#39;,&#39;files&#39;=>0,&#39;hits&#39;=>0,&#39;memory_consumption&#39;=>0,&#39;last_used_timestamp&#39;=>&#39;&#39;,&#39;timestamp&#39;=>&#39;&#39;); }
$files[$path[0]][&#39;full_path&#39;]=$path[0];
$files[$path[0]][&#39;files&#39;]++;
$files[$path[0]][&#39;memory_consumption&#39;]+=$data[&#39;memory_consumption&#39;];	
$files[$path[0]][&#39;hits&#39;]+=$data[&#39;hits&#39;];
if ( $data[&#39;last_used_timestamp&#39;]>$files[$path[0]][&#39;last_used_timestamp&#39;]) {$files[$path[0]][&#39;last_used_timestamp&#39;]=$data[&#39;last_used_timestamp&#39;];}
if ( $data[&#39;timestamp&#39;]>$files[$path[0]][&#39;timestamp&#39;]) {$files[$path[0]][&#39;timestamp&#39;]=$data[&#39;timestamp&#39;];}	
}	
}
}
if ( !empty($_GET[&#39;SORT&#39;]) ) {
$keys=array(
&#39;full_path&#39;=>SORT_STRING,
&#39;files&#39;=>SORT_NUMERIC,
&#39;memory_consumption&#39;=>SORT_NUMERIC,
&#39;hits&#39;=>SORT_NUMERIC,
&#39;last_used_timestamp&#39;=>SORT_NUMERIC,
&#39;timestamp&#39;=>SORT_NUMERIC
);
$titles=array(&#39;&#39;,&#39;path&#39;,$group?&#39;files&#39;:&#39;&#39;,&#39;size&#39;,&#39;hits&#39;,&#39;last used&#39;,&#39;created&#39;);
$offsets=array_keys($keys);
$key=intval($_GET[&#39;SORT&#39;]);
$direction=$key>0?1:-1;
$key=abs($key)-1;
$key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets);
$sort=array_search($key,$offsets)+1;
$sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
$arrow=array_fill(0,7,&#39;&#39;); $arrow[$sort]=$direction>0?&#39; ▼&#39;:&#39; ▲&#39;;
$direction=$direction>0?SORT_DESC:SORT_ASC;
$column=array(); foreach ($files as $data) { $column[]=$data[$key]; }
array_multisort($column, $keys[$key], $direction, $files);
}
 
echo &#39;<table border="0" cellpadding="3" width="960" id="files">
<tr class="h">&#39;;
foreach ($titles as $column=>$title) {
if ($title) echo &#39;<th><a href="&#39;,$nosort,&#39;&SORT=&#39;,$sortflip[$column],&#39;">&#39;,$title,$arrow[$column],&#39;</a></th>&#39;;
}
echo &#39; </tr>&#39;;
foreach ($files as $data) {
echo &#39;<tr>
<td class="v" nowrap><a title="recheck" href="?RECHECK=&#39;,rawurlencode($data[&#39;full_path&#39;]),&#39;">x</a>&#39;,$data[&#39;full_path&#39;],&#39;</td>&#39;,
($group?&#39;<td class="vr">&#39;.number_format($data[&#39;files&#39;]).&#39;</td>&#39;:&#39;&#39;),
&#39;<td class="vr">&#39;,number_format(round($data[&#39;memory_consumption&#39;]/1024)),&#39;K</td>&#39;,
&#39;<td class="vr">&#39;,number_format($data[&#39;hits&#39;]),&#39;</td>&#39;,
&#39;<td class="vr">&#39;,time_since($time,$data[&#39;last_used_timestamp&#39;]),&#39;</td>&#39;,
&#39;<td class="vr">&#39;,empty($data[&#39;timestamp&#39;])?&#39;&#39;:time_since($time,$data[&#39;timestamp&#39;]),&#39;</td>
</tr>&#39;;
}
echo &#39;</table>&#39;;
}
 
function graphs_display() {
$graphs=array();
$colors=array(&#39;green&#39;,&#39;brown&#39;,&#39;red&#39;);
$primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
$configuration=call_user_func(CACHEPREFIX.&#39;get_configuration&#39;);
$status=call_user_func(CACHEPREFIX.&#39;get_status&#39;);
 
$graphs[&#39;memory&#39;][&#39;total&#39;]=$configuration[&#39;directives&#39;][&#39;opcache.memory_consumption&#39;];
$graphs[&#39;memory&#39;][&#39;free&#39;]=$status[&#39;memory_usage&#39;][&#39;free_memory&#39;];
$graphs[&#39;memory&#39;][&#39;used&#39;]=$status[&#39;memory_usage&#39;][&#39;used_memory&#39;];
$graphs[&#39;memory&#39;][&#39;wasted&#39;]=$status[&#39;memory_usage&#39;][&#39;wasted_memory&#39;];
 
$graphs[&#39;keys&#39;][&#39;total&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;max_cached_keys&#39;];	
foreach ($primes as $prime) { if ($prime>=$graphs[&#39;keys&#39;][&#39;total&#39;]) { $graphs[&#39;keys&#39;][&#39;total&#39;]=$prime; break;} }
$graphs[&#39;keys&#39;][&#39;free&#39;]=$graphs[&#39;keys&#39;][&#39;total&#39;]-$status[CACHEPREFIX.&#39;statistics&#39;][&#39;num_cached_keys&#39;];
$graphs[&#39;keys&#39;][&#39;scripts&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;num_cached_scripts&#39;];
$graphs[&#39;keys&#39;][&#39;wasted&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;num_cached_keys&#39;]-$status[CACHEPREFIX.&#39;statistics&#39;][&#39;num_cached_scripts&#39;];
 
$graphs[&#39;hits&#39;][&#39;total&#39;]=0;
$graphs[&#39;hits&#39;][&#39;hits&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;hits&#39;];
$graphs[&#39;hits&#39;][&#39;misses&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;misses&#39;];
$graphs[&#39;hits&#39;][&#39;blacklist&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;blacklist_misses&#39;];
$graphs[&#39;hits&#39;][&#39;total&#39;]=array_sum($graphs[&#39;hits&#39;]);
 
$graphs[&#39;restarts&#39;][&#39;total&#39;]=0;
$graphs[&#39;restarts&#39;][&#39;manual&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;manual_restarts&#39;];
$graphs[&#39;restarts&#39;][&#39;keys&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;hash_restarts&#39;];
$graphs[&#39;restarts&#39;][&#39;memory&#39;]=$status[CACHEPREFIX.&#39;statistics&#39;][&#39;oom_restarts&#39;];
$graphs[&#39;restarts&#39;][&#39;total&#39;]=array_sum($graphs[&#39;restarts&#39;]);
 
foreach ( $graphs as $caption=>$graph) {
echo &#39;<p class="graph"><p class="h">&#39;,$caption,&#39;</p><table border="0" cellpadding="0" cellspacing="0">&#39;;	
foreach ($graph as $label=>$value) {
if ($label==&#39;total&#39;) { $key=0; $total=$value; $totaldisplay=&#39;<td rowspan="3" class="total"><span>&#39;.($total>999999?round($total/1024/1024).&#39;M&#39;:($total>9999?round($total/1024).&#39;K&#39;:$total)).&#39;</span><p></p></td>&#39;; continue;}
$percent=$total?floor($value*100/$total):&#39;&#39;; $percent=!$percent||$percent>99?&#39;&#39;:$percent.&#39;%&#39;;
echo &#39;<tr>&#39;,$totaldisplay,&#39;<td class="actual">&#39;, ($value>999999?round($value/1024/1024).&#39;M&#39;:($value>9999?round($value/1024).&#39;K&#39;:$value)),&#39;</td><td class="bar &#39;,$colors[$key],&#39;" height="&#39;,$percent,&#39;">&#39;,$percent,&#39;</td><td>&#39;,$label,&#39;</td></tr>&#39;;
$key++; $totaldisplay=&#39;&#39;;
}
echo &#39;</table></p>&#39;,"\n";
}
}
 
function meta_display() {
?>
<p class="meta">
<a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
<a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
<a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
<a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
<a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
<a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
</p>
<?php
}

相关推荐:

PHP7.0安装笔记整理,php7.0笔记整理_PHP教程

The above is the detailed content of PHP7.0 installation example in Linux environment. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn