Linux环境下PHP7.0的安装方法
这篇文章将为大家详细讲解有关Linux环境下PHP7.0的安装方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
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性能分析比较
生成一个 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)进行演示:
1||php_sapi_name()=='cli'||empty($_SERVER['REMOTE_ADDR'])){die;}//weakblockagainstindirectaccess $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,thisfeaturerequiresZendOpcachenewerthanApril8th2013';} exit; } ?>
OpcacheControlPanel
Details Files Reset Recheck Refresh Opcachenotdetected?';die;} if(!empty($_GET['FILES'])){echo' filescached
';files_display();echo'';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();//someinfoisonlyavailableviaphpinfo?sadlybufferingcapturehastobeused if(!preg_match('/module\_Zend(Optimizer\+|OPcache).+?(\]*\>.+?\<\/table\>).+?(\
]*\>.+?\<\/table\>)/s',$phpinfo,$opcache)){}//todo if(function_exists(CACHEPREFIX.'get_configuration')){echo'
general
';$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['PHPVersion']='PHP'.(defined('PHP_VERSION')?PHP_VERSION:'???').''.(defined('PHP_SAPI')?PHP_SAPI:'').''.(defined('PHP_OS')?''.PHP_OS:''); $version['OpcacheVersion']=empty($configuration['version']['version'])?'???':$configuration['version'][CACHEPREFIX.'product_name'].''.$configuration['version']['version']; print_table($version); if(!empty($opcache[2])){echopreg_replace('/\\ [^>]+\<\/td\>\ [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' memory'; print_table($status['memory_usage']); unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']); echo' statistics'; print_table($status[CACHEPREFIX.'statistics']); } if(empty($_GET['ALL'])){meta_display();exit;} if(!empty($configuration['blacklist'])){echo' blacklist';print_table($configuration['blacklist']);} if(!empty($opcache[3])){echo' runtime';echo$opcache[3];} $name='zendopcache';$functions=get_extension_funcs($name); if(!$functions){$name='zendoptimizer+';$functions=get_extension_funcs($name);} if($functions){echo' functions';print_table($functions);}else{$name='';} $level=trim(CACHEPREFIX,'_').'.optimization_level'; if(isset($configuration['directives'][$level])){ echo' optimizationlevels'; $levelset=strrev(base_convert($configuration['directives'][$level],10,2)); $levels=array( 1=>'Constantssubexpressionselimination(CSE)true,false,null,etc.
OptimizeseriesofADD_STRING/ADD_CHAR
ConvertCAST(IS_BOOL,x)intoBOOL(x)
ConvertINIT_FCALL_BY_NAME+DO_FCALL_BY_NAMEintoDO_FCALL', 2=>'Convertconstantoperandstoexpectedtypes
ConvertconditionalJMPwithconstantoperands
OptimizestaticBRKandCONT', 3=>'Convert$a=$a+exprinto$a+=expr
Convert$a++into++$a
OptimizeseriesofJMP', 4=>'PRINTandECHOoptimization(defunct)', 5=>'BlockOptimization-mostexpensivepass
Performsmanydifferentoptimizationpatternsbasedoncontrolflowgraph(CFG)', 9=>'Optimizeregisterallocation(allowsre-usageoftemporaryvariables)', 10=>'RemoveNOPs' ); echo'PassDescription'; foreach($levelsas$pass=>$description){ $disabled=substr($levelset,$pass-1,1)!=='1'||$pass==4?'white':''; echo' '.$pass.' '.$description.''; } echo''; } if(isset($_GET['DUMP'])){ if($name){echo' ini';print_table(ini_get_all($name,true));} foreach($configurationas$key=>$value){echo' ',$key,'
';print_table($configuration[$key]);} exit; } meta_display(); echo''; exit; functiontime_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; } functionprint_table($array,$headers=false){ if(empty($array)||!is_array($array)){return;} echo''; if(!empty($headers)){ if(!is_array($headers)){$headers=array_keys(reset($array));} echo' '; foreach($headersas$value){echo'',$value,'';} echo''; } foreach($arrayas$key=>$value){ echo''; if(!is_numeric($key)){ $key=ucwords(str_replace('_','',$key)); echo' ',$key,''; 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($valueas$column){ echo' ',$column,''; } echo''; } else{echo' ',$value,'';} } echo''; } functionfiles_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' ungroup| 1| 2| 3| 4| 5 '; 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','lastused','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($filesas$data){$column[]=$data[$key];} array_multisort($column,$keys[$key],$direction,$files); } echo' '; foreach($titlesas$column=>$title){ if($title)echo'',$title,$arrow[$column],''; } echo''; foreach($filesas$data){ echo' x',$data['full_path'],'', ($group?' '.number_format($data['files']).'':''), ' ',number_format(round($data['memory_consumption']/1024)),'K', ' ',number_format($data['hits']),'', ' ',time_since($time,$data['last_used_timestamp']),'', ' ',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),' '; } echo''; } functiongraphs_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($primesas$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($graphsas$caption=>$graph){ echo' ',$caption,' '; foreach($graphas$label=>$value){ if($label=='total'){$key=0;$total=$value;$totaldisplay=' '.($total>999999?round($total/1024/1024).'M':($total>9999?round($total/1024).'K':$total)).'';continue;} $percent=$total?floor($value*100/$total):'';$percent=!$percent||$percent>99?'':$percent.'%'; echo'',$totaldisplay,' ',($value>999999?round($value/1024/1024).'M':($value>9999?round($value/1024).'K':$value)),' ',$percent,'',$label,''; $key++;$totaldisplay=''; } echo'',"\n"; } } functionmeta_display(){ ?> directivesguide| functionsguide| wiki.php.net| pecl| Zendsource| OCPlatest 关于“Linux环境下PHP7.0的安装方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
- OpcacheControlPanel
Opcachenotdetected?';die;} if(!empty($_GET['FILES'])){echo'filescached - general
memory'; print_table($status['memory_usage']); unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']); echo' statistics'; print_table($status[CACHEPREFIX.'statistics']); } if(empty($_GET['ALL'])){meta_display();exit;} if(!empty($configuration['blacklist'])){echo' blacklist';print_table($configuration['blacklist']);} if(!empty($opcache[3])){echo' runtime';echo$opcache[3];} $name='zendopcache';$functions=get_extension_funcs($name); if(!$functions){$name='zendoptimizer+';$functions=get_extension_funcs($name);} if($functions){echo' functions';print_table($functions);}else{$name='';} $level=trim(CACHEPREFIX,'_').'.optimization_level'; if(isset($configuration['directives'][$level])){ echo' optimizationlevels'; $levelset=strrev(base_convert($configuration['directives'][$level],10,2)); $levels=array( 1=>'Constantssubexpressionselimination(CSE)true,false,null,etc.
OptimizeseriesofADD_STRING/ADD_CHAR
ConvertCAST(IS_BOOL,x)intoBOOL(x)
ConvertINIT_FCALL_BY_NAME+DO_FCALL_BY_NAMEintoDO_FCALL', 2=>'Convertconstantoperandstoexpectedtypes
ConvertconditionalJMPwithconstantoperands
OptimizestaticBRKandCONT', 3=>'Convert$a=$a+exprinto$a+=expr
Convert$a++into++$a
OptimizeseriesofJMP', 4=>'PRINTandECHOoptimization(defunct)', 5=>'BlockOptimization-mostexpensivepass
Performsmanydifferentoptimizationpatternsbasedoncontrolflowgraph(CFG)', 9=>'Optimizeregisterallocation(allowsre-usageoftemporaryvariables)', 10=>'RemoveNOPs' ); echo'PassDescription'; foreach($levelsas$pass=>$description){ $disabled=substr($levelset,$pass-1,1)!=='1'||$pass==4?'white':''; echo' '.$pass.' '.$description.''; } echo''; } if(isset($_GET['DUMP'])){ if($name){echo' ini';print_table(ini_get_all($name,true));} foreach($configurationas$key=>$value){echo'',$key,'
推荐阅读
-
linux怎么搭建ftp服务器(linux ftp命令)
linuxftp命令?很欢喜问本问题,此观点祝你好运吧!再连接ftp服务器。格式:ftp[hostname|ip-address...
-
linux怎么调出屏幕键盘(linux | 怎么打出来,管道符号怎么打)
linux|怎么打出来,管道符号怎么打?楼主,你好!“|”这个符号在linux环境称做“管道符”框输入方法:Shift键盘的“...
-
linux系统生成core文件(linux udp缓存配置)
linuxudp缓存配置?临时再添加:sysctl-w_max26214400无限制再添加:将以下行添加到中:_max26214...
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...
-
干了10多年的php,还不会安装,是不是丢人
-
Linux编程的十大代码编辑器新鲜出炉,你用的入榜单了吗?
-
从7到8,CentOS又更新了什么
-
PHP程序员的技术成长规划-基础阶段篇
-
Linux curl命令
Linuxcurl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但...
-
CentOS和RedHat下8个最常用的YUM库
-
linux怎么搭建ftp服务器(linux ftp命令)
linuxftp命令?很欢喜问本问题,此观点祝你好运吧!再连接ftp服务器。格式:ftp[hostname|ip-address...
-
linux怎么调出屏幕键盘(linux | 怎么打出来,管道符号怎么打)
linux|怎么打出来,管道符号怎么打?楼主,你好!“|”这个符号在linux环境称做“管道符”框输入方法:Shift键盘的“...
-
linux系统生成core文件(linux udp缓存配置)
linuxudp缓存配置?临时再添加:sysctl-w_max26214400无限制再添加:将以下行添加到中:_max26214...
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...
-
干了10多年的php,还不会安装,是不是丢人
-
Linux编程的十大代码编辑器新鲜出炉,你用的入榜单了吗?
-
从7到8,CentOS又更新了什么
-
PHP程序员的技术成长规划-基础阶段篇
-
Linux curl命令
Linuxcurl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但...
-
CentOS和RedHat下8个最常用的YUM库
-
linux怎么搭建ftp服务器(linux ftp命令)
linuxftp命令?很欢喜问本问题,此观点祝你好运吧!再连接ftp服务器。格式:ftp[hostname|ip-address...
-
linux怎么调出屏幕键盘(linux | 怎么打出来,管道符号怎么打)
linux|怎么打出来,管道符号怎么打?楼主,你好!“|”这个符号在linux环境称做“管道符”框输入方法:Shift键盘的“...
-
linux系统生成core文件(linux udp缓存配置)
linuxudp缓存配置?临时再添加:sysctl-w_max26214400无限制再添加:将以下行添加到中:_max26214...
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...
-
干了10多年的php,还不会安装,是不是丢人
-
Linux编程的十大代码编辑器新鲜出炉,你用的入榜单了吗?
-
从7到8,CentOS又更新了什么
-
PHP程序员的技术成长规划-基础阶段篇
-
Linux curl命令
Linuxcurl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但...
-
CentOS和RedHat下8个最常用的YUM库