Linux 환경에서 PHP7.0을 설치하는 방법
이 글에서는 Linux 환경에서 PHP7.0을 설치하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
PHP7과 HHVM의 비교
실제 시나리오에서 PHP7의 성능은 실제로 HHVM과 동일하며 일부 시나리오에서는 HHVM을 초과하기도 합니다. HHVM의 운영 및 유지 관리는 복잡하며 다중 스레드 모델입니다. 즉, 스레드로 인해 충돌이 발생하면 전체 서비스가 중단되고 자동으로 다시 시작되지 않습니다. 또한 JIT를 사용하는데, 이는 다시 시작한 후 예열이 필요하다는 것을 의미합니다. 예열하지 않으면 성능이 저하됩니다. 게다가 멀티스레드 모델은 디버깅이 어려워 안정성을 추구하는 웹 서비스에는 매우 부적합하다.
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
Download
# 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 구성을 변경해야 합니다
Start
# /etc/init.d/php-fpm
View phpinfo()
php7 및 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); } ?>
600,000개 요소의 배열 생성 , 키를 찾아 확인합니다. 키가 존재하는지 여부를 확인합니다.
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]# 시간 /usr/local/php/bin/php search_by_key.php
real 0m0.361s
user 0m0.304s
sys 0m0.05 7s
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
# Join
Restart
# 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('display_errors',1); error_reporting(-1); if ( count(get_included_files())>1 || php_sapi_name()=='cli' || empty($_SERVER['REMOTE_ADDR']) ) { die; } // weak block against indirect access $time=time(); define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':'')); if ( !empty($_GET['RESET']) ) { if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); } header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) ); exit; } if ( !empty($_GET['RECHECK']) ) { if ( function_exists(CACHEPREFIX.'invalidate') ) { $recheck=trim($_GET['RECHECK']); $files=call_user_func(CACHEPREFIX.'get_status'); if (!empty($files['scripts'])) { foreach ($files['scripts'] as $file=>$value) { if ( $recheck==='1' || strpos($file,$recheck)===0 ) call_user_func(CACHEPREFIX.'invalidate',$file); } } header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) ); } else { echo 'Sorry, this feature requires Zend Opcache newer than April 8th 2013'; } 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.οnlοad=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';}} </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" οnclick="return confirm('RESET cache ?')">Reset</a> <?php if ( function_exists(CACHEPREFIX.'invalidate') ) { ?> <a href="?RECHECK=1" οnclick="return confirm('Recheck all files in the cache ?')">Recheck</a> <?php } ?> <a href="?" οnclick="window.location.reload(true); return false">Refresh</a> </p> <?php if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; } if ( !empty($_GET['FILES']) ) { echo '<h2>files cached</h2>'; files_display(); echo '</p></body></html>'; exit; } if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { 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( '/module\_Zend (Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s', $phpinfo, $opcache) ) { } // todo if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); } $host=function_exists('gethostname')?@gethostname():@php_uname('n'); if (empty($host)) { $host=empty($_SERVER['SERVER_NAME'])?$_SERVER['HOST_NAME']:$_SERVER['SERVER_NAME']; } $version=array('Host'=>$host); $version['PHP Version']='PHP '.(defined('PHP_VERSION')?PHP_VERSION:'???').' '.(defined('PHP_SAPI')?PHP_SAPI:'').' '.(defined('PHP_OS')?' '.PHP_OS:''); $version['Opcache Version']=empty($configuration['version']['version'])?'???':$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version']; print_table($version); if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); } if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) { $uptime=array(); if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) { $uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,''); } if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) { $uptime['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']); } if (!empty($uptime)) {print_table($uptime);} if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; } echo '<h2 id="memory">memory</h2>'; print_table($status['memory_usage']); unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']); echo '<h2 id="statistics">statistics</h2>'; print_table($status[CACHEPREFIX.'statistics']); } if ( empty($_GET['ALL']) ) { meta_display(); exit; } if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); } if ( !empty($opcache[3]) ) { echo '<h2 id="runtime">runtime</h2>'; echo $opcache[3]; } $name='zend opcache'; $functions=get_extension_funcs($name); if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); } if ($functions) { echo '<h2 id="functions">functions</h2>'; print_table($functions); } else { $name=''; } $level=trim(CACHEPREFIX,'_').'.optimization_level'; if (isset($configuration['directives'][$level])) { echo '<h2 id="optimization">optimization levels</h2>'; $levelset=strrev(base_convert($configuration['directives'][$level], 10, 2)); $levels=array( 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>', 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>', 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>', 4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)', 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)', 9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)', 10=>'Remove NOPs' ); echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>'; foreach ($levels as $pass=>$description) { $disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':''; echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>'; } echo '</table>'; } if ( isset($_GET['DUMP']) ) { if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); } foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); } exit; } meta_display(); echo '</p></body></html>'; exit; function time_since($time,$original,$extended=0,$text='ago') { $time = $time - $original; $day = $extended? floor($time/86400) : round($time/86400,0); $amount=0; $unit=''; if ( $time < 86400) { if ( $time < 60) { $amount=$time; $unit='second'; } elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; } else { $amount=floor($time/3600); $unit='hour'; } } elseif ( $day < 14) { $amount=$day; $unit='day'; } elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; } elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; } else { $amount=intval(2*($day/365))/2; $unit='year'; } if ( $amount!=1) {$unit.='s';} if ($extended && $time>60) { $text=' and '.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,'').$text; } return $amount.' '.$unit.' '.$text; } function print_table($array,$headers=false) { if ( empty($array) || !is_array($array) ) {return;} echo '<table border="0" cellpadding="3" width="600">'; if (!empty($headers)) { if (!is_array($headers)) {$headers=array_keys(reset($array));} echo '<tr class="h">'; foreach ($headers as $value) { echo '<th>',$value,'</th>'; } echo '</tr>'; } foreach ($array as $key=>$value) { echo '<tr>'; if ( !is_numeric($key) ) { $key=ucwords(str_replace('_',' ',$key)); echo '<td class="e">',$key,'</td>'; if ( is_numeric($value) ) { if ( $value>1048576) { $value=round($value/1048576,1).'M'; } elseif ( is_float($value) ) { $value=round($value,1); } } } if ( is_array($value) ) { foreach ($value as $column) { echo '<td class="v">',$column,'</td>'; } echo '</tr>'; } else { echo '<td class="v">',$value,'</td></tr>'; } } echo '</table>'; } function files_display() { $status=call_user_func(CACHEPREFIX.'get_status'); if ( empty($status['scripts']) ) {return;} if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;} $time=time(); $sort=0; $nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']); $nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']); $group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;} $groupset=array_fill(0,9,''); $groupset[$group]=' class="b" '; echo '<p class="meta"> <a ',$groupset[0],'href="',$nogroup,'">ungroup</a> | <a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> | <a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> | <a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> | <a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> | <a ',$groupset[5],'href="',$nogroup,'&GROUP=5">5</a> </p>'; if ( !$group ) { $files =& $status['scripts']; } else { $files=array(); foreach ($status['scripts'] as $data) { if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) { if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); } $files[$path[0]]['full_path']=$path[0]; $files[$path[0]]['files']++; $files[$path[0]]['memory_consumption']+=$data['memory_consumption']; $files[$path[0]]['hits']+=$data['hits']; if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];} if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];} } } } if ( !empty($_GET['SORT']) ) { $keys=array( 'full_path'=>SORT_STRING, 'files'=>SORT_NUMERIC, 'memory_consumption'=>SORT_NUMERIC, 'hits'=>SORT_NUMERIC, 'last_used_timestamp'=>SORT_NUMERIC, 'timestamp'=>SORT_NUMERIC ); $titles=array('','path',$group?'files':'','size','hits','last used','created'); $offsets=array_keys($keys); $key=intval($_GET['SORT']); $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,''); $arrow[$sort]=$direction>0?' ▼':' ▲'; $direction=$direction>0?SORT_DESC:SORT_ASC; $column=array(); foreach ($files as $data) { $column[]=$data[$key]; } array_multisort($column, $keys[$key], $direction, $files); } echo '<table border="0" cellpadding="3" width="960" id="files"> <tr class="h">'; foreach ($titles as $column=>$title) { if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>'; } echo ' </tr>'; foreach ($files as $data) { echo '<tr> <td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>', ($group?'<td class="vr">'.number_format($data['files']).'</td>':''), '<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>', '<td class="vr">',number_format($data['hits']),'</td>', '<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>', '<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td> </tr>'; } echo '</table>'; } function graphs_display() { $graphs=array(); $colors=array('green','brown','red'); $primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987); $configuration=call_user_func(CACHEPREFIX.'get_configuration'); $status=call_user_func(CACHEPREFIX.'get_status'); $graphs['memory']['total']=$configuration['directives']['opcache.memory_consumption']; $graphs['memory']['free']=$status['memory_usage']['free_memory']; $graphs['memory']['used']=$status['memory_usage']['used_memory']; $graphs['memory']['wasted']=$status['memory_usage']['wasted_memory']; $graphs['keys']['total']=$status[CACHEPREFIX.'statistics']['max_cached_keys']; foreach ($primes as $prime) { if ($prime>=$graphs['keys']['total']) { $graphs['keys']['total']=$prime; break;} } $graphs['keys']['free']=$graphs['keys']['total']-$status[CACHEPREFIX.'statistics']['num_cached_keys']; $graphs['keys']['scripts']=$status[CACHEPREFIX.'statistics']['num_cached_scripts']; $graphs['keys']['wasted']=$status[CACHEPREFIX.'statistics']['num_cached_keys']-$status[CACHEPREFIX.'statistics']['num_cached_scripts']; $graphs['hits']['total']=0; $graphs['hits']['hits']=$status[CACHEPREFIX.'statistics']['hits']; $graphs['hits']['misses']=$status[CACHEPREFIX.'statistics']['misses']; $graphs['hits']['blacklist']=$status[CACHEPREFIX.'statistics']['blacklist_misses']; $graphs['hits']['total']=array_sum($graphs['hits']); $graphs['restarts']['total']=0; $graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts']; $graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts']; $graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts']; $graphs['restarts']['total']=array_sum($graphs['restarts']); foreach ( $graphs as $caption=>$graph) { echo '<p class="graph"><p class="h">',$caption,'</p><table border="0" cellpadding="0" cellspacing="0">'; foreach ($graph as $label=>$value) { 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><p></p></td>'; continue;} $percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%'; 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>'; $key++; $totaldisplay=''; } echo '</table></p>',"\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 }
추천 학습: php 비디오 튜토리얼
위 내용은 Linux 환경에서 PHP7.0을 설치하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











php7.0에서 mongo 확장을 설치하는 방법: 1. mongodb 사용자 그룹 및 사용자를 생성합니다. 2. mongodb 소스 코드 패키지를 다운로드하고 소스 코드 패키지를 "/usr/local/src/" 디렉터리에 넣습니다. "src/" 디렉터리를 입력합니다. 4. 소스 코드 패키지의 압축을 풉니다. 5. mongodb 파일 디렉터리를 생성합니다. 6. "mongodb/" 디렉터리에 파일을 복사합니다. 7. mongodb 구성 파일을 생성하고 구성을 수정합니다.

php5에서는 fsockopen() 함수를 사용하여 TCP 포트를 감지할 수 있습니다. 이 기능은 네트워크 연결을 열고 일부 네트워크 통신을 수행하는 데 사용할 수 있습니다. 그러나 php7에서는 fsockopen() 함수에 포트를 열 수 없거나 서버에 연결할 수 없는 등의 몇 가지 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해, 우리는 소켓_create() 함수와 소켓_연결() 함수를 사용하여 TCP 포트를 감지할 수 있습니다.

PHP 7.0에서 설치된 플러그인이 표시되지 않는 문제를 해결하려면: 플러그인 구성을 확인하고 플러그인을 활성화하세요. 구성 변경 사항을 적용하려면 PHP를 다시 시작하세요. 플러그인 파일 권한이 올바른지 확인하세요. 플러그인이 올바르게 작동하도록 하려면 누락된 종속성을 설치하세요. 다른 모든 단계가 실패하면 PHP를 다시 빌드하세요. 다른 가능한 원인으로는 호환되지 않는 플러그인 버전, 잘못된 버전 로드 또는 PHP 구성 문제 등이 있습니다.

PHP 서버 환경에 대한 일반적인 솔루션에는 올바른 PHP 버전이 설치되어 있는지, 관련 파일이 모듈 디렉터리에 복사되었는지 확인하는 것이 포함됩니다. SELinux를 일시적으로 또는 영구적으로 비활성화합니다. 필요한 확장이 추가되고 올바르게 설정되었는지 확인하려면 PHP.ini를 확인하고 구성하십시오. PHP-FPM 서비스를 시작하거나 다시 시작합니다. 해결 문제에 대해서는 DNS 설정을 확인하세요.

php7.0 설치 및 배포 방법: 1. PHP 공식 웹사이트로 이동하여 로컬 시스템에 해당하는 설치 버전을 다운로드합니다. 2. 다운로드한 zip 파일을 지정된 디렉터리에 추출합니다. 3. 명령줄 창을 열고 다음으로 이동합니다. "E:\php7" 디렉토리 "php -v" 명령을 실행하세요.

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

Docker 환경을 사용할 때 Docker 환경에 Extensions를 설치하기 위해 PECL을 사용하여 오류의 원인 및 솔루션. 종종 일부 두통이 발생합니다 ...

PHP7과 비교하여 PHP8은 성능, 새로운 기능 및 구문 개선, 유형 시스템, 오류 처리 및 확장 측면에서 몇 가지 장점과 개선 사항을 가지고 있습니다. 그러나 사용할 버전을 선택하는 것은 특정 요구 사항과 프로젝트 상황에 따라 다릅니다. 자세한 소개: 1. 성능 향상, PHP8은 코드 실행 속도를 향상시킬 수 있는 JIT(Just-in-Time) 컴파일러를 도입합니다. 2. 새로운 기능 및 구문 개선, PHP8은 명명된 매개 변수 및 선택적 매개 변수 선언을 지원합니다. 함수 만들기 호출이 더 유연해졌습니다. 익명 클래스, 속성 유형 선언 등이 도입되었습니다.
