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
<?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); } ?>
生成一个 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)进行演示:
<?php /* OCP-OpcacheControlPanel(akaZendOptimizer+ControlPanelforPHP) Author:_ck_(withcontributionsbyGK,stasilok) Version:0.1.6 Freeforanykindofuseormodification,Iamnotresponsibleforanything,pleaseshareyourimprovements *revisionhistory 0.1.62013-04-12movedmetatofootersographscanbehigherandreduceclutter 0.1.52013-04-12addedgraphstovisualizecachestate,pleasereportanybrowser/stylebugs 0.1.42013-04-09added"recheck"toupdatefileswhenusinglargerevalidate_freq(orvalidate_timestamps=Off) 0.1.32013-03-30showhostandphpversion,canbookmarkwithhashtagie.#statistics-needsnewlayoutasap 0.1.22013-03-25showoptimizationlevels,numberformatting,supportforstart_timein7.0.2 0.1.12013-03-18todayZendcompletelyrenamedOptimizer+toOPcache,adjustedOCPtokeepworking 0.1.02013-03-17addedgroup/sortindicators,replaced"accelerator_"functionswith"opcache_" 0.0.62013-03-16transitionsupportasZendrenamesproductandfunctionsforPHP5.5(stasilok) 0.0.52013-03-10addedrefreshbutton(GK) 0.0.42013-02-18addedfilegroupingandsorting(clickonheaders)-codeneedscleanupbutgetsthejobdone 0.0.22013-02-14firstpublicrelease *knownproblems/limitations: UnlikeAPC,theZendOPcacheAPI -cannotdeterminewhenafilewasputintothecache -cannotchangesettingsonthefly -cannotprotectopcachefunctionsbyrestrictingexecutiontoonlyspecificscripts/paths *todo: Extractvariablesforpreferedorderingandbetterlayoutinsteadofjustdumpingintotables Filelistfilter */ //ini_set('display_errors',1);error_reporting(-1); if(count(get_included_files())>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; } ?><!DOCTYPEhtml>
<body> <pclass="center"> <h2><ahref="?">OpcacheControlPanel</a></h2> <pclass="buttons"> <ahref="?ALL=1">Details</a> <ahref="?FILES=1&GROUP=2&SORT=3">Files</a> <ahref="?RESET=1""returnconfirm('RESETcache?')">Reset</a> <?phpif(function_exists(CACHEPREFIX.'invalidate')){?> <ahref="?RECHECK=1""returnconfirm('Recheckallfilesinthecache?')">Recheck</a> <?php}?> <ahref="?""window.location.reload(true);returnfalse">Refresh</a> </p> <?php if(!function_exists(CACHEPREFIX.'get_status')){echo'<h3>Opcachenotdetected?</h3>';die;} if(!empty($_GET['FILES'])){echo'<h3>filescached</h3>';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();//someinfoisonlyavailableviaphpinfo?sadlybufferingcapturehastobeused if(!preg_match('/module\_Zend(Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/s',$phpinfo,$opcache)){}//todo if(function_exists(CACHEPREFIX.'get_configuration')){echo'<h3>general</h3>';$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('/\<tr\>\<tdclass\="e"\>[^>]+\<\/td\>\<tdclass\="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'<h3id="memory">memory</h3>'; print_table($status['memory_usage']); unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']); echo'<h3id="statistics">statistics</h3>'; print_table($status[CACHEPREFIX.'statistics']); } if(empty($_GET['ALL'])){meta_display();exit;} if(!empty($configuration['blacklist'])){echo'<h3id="blacklist">blacklist</h3>';print_table($configuration['blacklist']);} if(!empty($opcache[3])){echo'<h3id="runtime">runtime</h3>';echo$opcache[3];} $name='zendopcache';$functions=get_extension_funcs($name); if(!$functions){$name='zendoptimizer+';$functions=get_extension_funcs($name);} if($functions){echo'<h3id="functions">functions</h3>';print_table($functions);}else{$name='';} $level=trim(CACHEPREFIX,'_').'.optimization_level'; if(isset($configuration['directives'][$level])){ echo'<h3id="optimization">optimizationlevels</h3>'; $levelset=strrev(base_convert($configuration['directives'][$level],10,2)); $levels=array( 1=>'<ahref="http://wikipedia.org/wiki/Common_subexpression_elimination">Constantssubexpressionselimination</a>(CSE)true,false,null,etc.<br/>OptimizeseriesofADD_STRING/ADD_CHAR<br/>ConvertCAST(IS_BOOL,x)intoBOOL(x)<br/>Convert<ahref="http://www.php.net/manual/internals2.opcodes.init-fcall-by-name.php">INIT_FCALL_BY_NAME</a>+<ahref="http://www.php.net/manual/internals2.opcodes.do-fcall-by-name.php">DO_FCALL_BY_NAME</a>into<ahref="http://www.php.net/manual/internals2.opcodes.do-fcall.php">DO_FCALL</a>', 2=>'Convertconstantoperandstoexpectedtypes<br/>Convertconditional<ahref="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a>withconstantoperands<br/>Optimizestatic<ahref="http://php.net/manual/internals2.opcodes.brk.php">BRK</a>and<ahref="<ahref="http://php.net/manual/internals2.opcodes.cont.php">CONT</a>', 3=>'Convert$a=$a+exprinto$a+=expr<br/>Convert$a++into++$a<br/>Optimizeseriesof<ahref="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a>', 4=>'PRINTandECHOoptimization(<ahref="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)', 5=>'BlockOptimization-mostexpensivepass<br/>Performsmanydifferentoptimizationpatternsbasedon<ahref="http://wikipedia.org/wiki/Control_flow_graph">controlflowgraph</a>(CFG)', 9=>'Optimize<ahref="http://wikipedia.org/wiki/Register_allocation">registerallocation</a>(allowsre-usageoftemporaryvariables)', 10=>'RemoveNOPs' ); echo'<tablewidth="600"border="0"cellpadding="3"><tbody><trclass="h"><th>Pass</th><th>Description</th></tr>'; foreach($levelsas$pass=>$description){ $disabled=substr($levelset,$pass-1,1)!=='1'||$pass==4?'white':''; echo'<tr><tdclass="vcentermiddle'.$disabled.'">'.$pass.'</td><tdclass="v'.$disabled.'">'.$description.'</td></tr>'; } echo'</table>'; } if(isset($_GET['DUMP'])){ if($name){echo'<h3id="ini">ini</h3>';print_table(ini_get_all($name,true));} foreach($configurationas$key=>$value){echo'<h3>',$key,'</h3>';print_table($configuration[$key]);} exit; } meta_display(); echo'</p></body></html>'; 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'<tableborder="0"cellpadding="3"width="600">'; if(!empty($headers)){ if(!is_array($headers)){$headers=array_keys(reset($array));} echo'<trclass="h">'; foreach($headersas$value){echo'<th>',$value,'</th>';} echo'</tr>'; } foreach($arrayas$key=>$value){ echo'<tr>'; if(!is_numeric($key)){ $key=ucwords(str_replace('_','',$key)); echo'<tdclass="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($valueas$column){ echo'<tdclass="v">',$column,'</td>'; } echo'</tr>'; } else{echo'<tdclass="v">',$value,'</td></tr>';} } echo'</table>'; } 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'<pclass="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','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'<tableborder="0"cellpadding="3"width="960"id="files"> <trclass="h">'; foreach($titlesas$column=>$title){ if($title)echo'<th><ahref="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>'; } echo'</tr>'; foreach($filesas$data){ echo'<tr> <tdclass="v"nowrap><atitle="recheck"href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>', ($group?'<tdclass="vr">'.number_format($data['files']).'</td>':''), '<tdclass="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>', '<tdclass="vr">',number_format($data['hits']),'</td>', '<tdclass="vr">',time_since($time,$data['last_used_timestamp']),'</td>', '<tdclass="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td> </tr>'; } echo'</table>'; } 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'<pclass="graph"><pclass="h">',$caption,'</p><tableborder="0"cellpadding="0"cellspacing="0">'; foreach($graphas$label=>$value){ if($label=='total'){$key=0;$total=$value;$totaldisplay='<tdrowspan="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,'<tdclass="actual">',($value>999999?round($value/1024/1024).'M':($value>9999?round($value/1024).'K':$value)),'</td><tdclass="bar',$colors[$key],'"height="',$percent,'">',$percent,'</td><td>',$label,'</td></tr>'; $key++;$totaldisplay=''; } echo'</table></p>',"\n"; } } functionmeta_display(){ ?> <pclass="meta"> <ahref="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directivesguide</a>| <ahref="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functionsguide</a>| <ahref="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a>| <ahref="http://pecl.php.net/package/ZendOpcache">pecl</a>| <ahref="https://github.com/zend-dev/ZendOptimizerPlus/">Zendsource</a>| <ahref="https://gist.github.com/ck-on/4959032/?ocp.php">OCPlatest</a> </p> <?php }
关于“Linux环境下PHP7.0的安装方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
推荐阅读
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...
-
干了10多年的php,还不会安装,是不是丢人
-
Linux编程的十大代码编辑器新鲜出炉,你用的入榜单了吗?
-
从7到8,CentOS又更新了什么
-
PHP程序员的技术成长规划-基础阶段篇
-
Linux curl命令
Linuxcurl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但...
-
CentOS和RedHat下8个最常用的YUM库
-
Linux系列之CentOS+Nginx+PHP+MySQL
-
3分钟短文:Laravel写个命令行,你就是下一个Geek
-
是时候深入了解Linux的系统结构了
什么是Linux?如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版。在查看Linux...