A5下载文章资讯

分类分类

8个必备的PHP功能开发

2015-10-02 13:37作者:fang

PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握。

1、传递任意数量的函数参数

我们在.NET或者JAVA编程中,一般函数参数个数都是固定的,但是PHP允许你使用任意个数的参数。下面这个示例向你展示了PHP函数的默认参数:

//两个默认参数的函数functionfoo($arg1=”,$arg2=”){echo“arg1:$arg1n”;echo“arg2:$arg2n”;}foo(‘hello','world');/*输出:arg1:helloarg2:world*/foo();/*输出:arg1:arg2:*/

下面这个示例是PHP的不定参数用法,其使用到了func_get_args()方法:

//是的,形参列表为空functionfoo(){//取得所有的传入参数的数组$args=func_get_args();foreach($argsas$k=>$v){echo“arg”.($k+1).”:$vn”;}}foo();/*什么也不会输出*/foo(‘hello');/*输出arg1:hello*/foo(‘hello',‘world',‘again');/*输出arg1:helloarg2:worldarg3:again*/

2、使用glob()查找文件

大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到glob()的时候,你也许并不知道这是用来做什么的,其实glob()和scandir()一样,可以用来查找文件,请看下面的用法:

//取得所有的后缀为PHP的文件$files=glob(‘*.php');print_r($files);/*输出:Array([0]=>phptest.php[1]=>pi.php[2]=>post_output.php[3]=>test.php)*/你还可以查找多种后缀名://取PHP文件和TXT文件$files=glob(‘*.{php,txt}',GLOB_BRACE);print_r($files);/*输出:Array([0]=>phptest.php[1]=>pi.php[2]=>post_output.php[3]=>test.php[4]=>log.txt[5]=>test.txt13.)*/

你还可以加上路径:

$files=glob(‘../images/a*.jpg');print_r($files);/*输出:Array([0]=>../images/apple.jpg[1]=>../images/art.jpg)*/

如果你想得到绝对路径,你可以调用realpath()函数:

$files=glob(‘../images/a*.jpg');//appliesthefunctiontoeacharrayelement$files=array_map(‘realpath',$files);print_r($files);/*outputlookslike:Array([0]=>C:wampwwwimagesapple.jpg[1]=>C:wampwwwimagesart.jpg)*/

3、获取内存使用情况信息

PHP的内存回收机制已经非常强大,你也可以使用PHP脚本获取当前内存的使用情况,调用memory_get_usage()函数获取当期内存使用情况,调用memory_get_peak_usage()函数获取内存使用的峰值。参考代码如下:

echo“Initial:“.memory_get_usage().”bytesn”;/*输出Initial:361400bytes*///使用内存for($i=0;$i<100000;$i++){$array[]=md5($i);}//删除一半的内存for($i=0;$i<100000;$i++){unset($array[$i]);}echo“Final:“.memory_get_usage().”bytesn”;/*printsFinal:885912bytes*/echo“Peak:“.memory_get_peak_usage().”bytesn”;/*输出峰值Peak:13687072bytes*/

4、获取CPU使用情况信息

获取了内存使用情况,也可以使用PHP的getrusage()获取CPU使用情况,该方法在windows下不可用。

print_r(getrusage());/*输出Array([ru_oublock]=>0[ru_inblock]=>0[ru_msgsnd]=>2[ru_msgrcv]=>3[ru_maxrss]=>12692[ru_ixrss]=>764[ru_idrss]=>3864[ru_minflt]=>94[ru_majflt]=>0[ru_nsignals]=>1[ru_nvcsw]=>67[ru_nivcsw]=>4[ru_nswap]=>0[ru_utime.tv_usec]=>0[ru_utime.tv_sec]=>0[ru_stime.tv_usec]=>6269[ru_stime.tv_sec]=>0)*/

这个结构看上出很晦涩,除非你对CPU很了解。下面一些解释:

ru_oublock:块输出操作

ru_inblock:块输入操作

ru_msgsnd:发送的message

ru_msgrcv:收到的message

ru_maxrss:最大驻留集大小

ru_ixrss:全部共享内存大小

ru_idrss:全部非共享内存大小

ru_minflt:页回收

ru_majflt:页失效

ru_nsignals:收到的信号

ru_nvcsw:主动上下文切换

ru_nivcsw:被动上下文切换

ru_nswap:交换区

ru_utime.tv_usec:用户态时间(microseconds)

ru_utime.tv_sec:用户态时间(seconds)

ru_stime.tv_usec:系统内核时间(microseconds)

ru_stime.tv_sec:系统内核时间?(seconds)

要看到你的脚本消耗了多少CPU,我们需要看看“用户态的时间”和“系统内核时间”的值。秒和微秒部分是分别提供的,您可以把微秒值除以100万,并把它添加到秒的值后,可以得到有小数部分的秒数。

//sleepfor3seconds(non-busy)sleep(3);$data=getrusage();echo“Usertime:“.($data['ru_utime.tv_sec']+$data['ru_utime.tv_usec']/1000000);echo“Systemtime:“.($data['ru_stime.tv_sec']+$data['ru_stime.tv_usec']/1000000);/*输出Usertime:0.011552Systemtime:0*/sleep是不占用系统时间的,我们可以来看下面的一个例子://loop10milliontimes(busy)for($i=0;$i<10000000;$i++){}$data=getrusage();echo“Usertime:“.($data['ru_utime.tv_sec']+$data['ru_utime.tv_usec']/1000000);echo“Systemtime:“.($data['ru_stime.tv_sec']+$data['ru_stime.tv_usec']/1000000);/*输出Usertime:1.424592Systemtime:0.004204*/

这花了大约14秒的CPU时间,几乎所有的都是用户的时间,因为没有系统调用。

系统时间是CPU花费在系统调用上的上执行内核指令的时间。下面是一个例子:

$start=microtime(true);//keepcallingmicrotimeforabout3secondswhile(microtime(true)–$start<3){}$data=getrusage();echo“Usertime:“.($data['ru_utime.tv_sec']+$data['ru_utime.tv_usec']/1000000);echo“Systemtime:“.($data['ru_stime.tv_sec']+$data['ru_stime.tv_usec']/1000000);/*printsUsertime:1.088171Systemtime:1.675315*/

我们可以看到上面这个例子更耗CPU。

5、获取系统常量

PHP提供非常有用的系统常量可以让你得到当前的行号(__LINE__),文件(__FILE__),目录(__DIR__),函数名(__FUNCTION__),类名(__CLASS__),方法名(__METHOD__)和名字空间(__NAMESPACE__),很像C语言。

我们可以以为这些东西主要是用于调试,当也不一定,比如我们可以在include其它文件的时候使用?__FILE__(当然,你也可以在PHP5.3以后使用__DIR__),下面是一个例子。

//thisisrelativetotheloadedscript'spath//itmaycauseproblemswhenrunningscriptsfromdifferentdirectoriesrequire_once(‘config/database.php');//thisisalwaysrelativetothisfile'spath//nomatterwhereitwasincludedfromrequire_once(dirname(__FILE__).‘/config/database.php');

下面是使用__LINE__来输出一些debug的信息,这样有助于你调试程序:

//somecode//…my_debug(“somedebugmessage”,__LINE__);/*输出Line4:somedebugmessage*///somemorecode//…my_debug(“anotherdebugmessage”,__LINE__);/*输出Line11:anotherdebugmessage*/functionmy_debug($msg,$line){echo“Line$line:$msgn”;}

6、生成唯一的id

很多朋友都利用md5()来生成唯一的编号,但是md5()有几个缺点:1、无序,导致数据库中排序性能下降。2、太长,需要更多的存储空间。其实PHP中自带一个函数来生成唯一的id,这个函数就是uniqid()。下面是用法:

//generateuniquestringechouniqid();/*输出4bd67c947233e*///generateanotheruniquestringechouniqid();/*输出4bd67c9472340*/

该算法是根据CPU时间戳来生成的,所以在相近的时间段内,id前几位是一样的,这也方便id的排序,如果你想更好的避免重复,可以在id前加上前缀,如:

//前缀echouniqid(‘foo_');/*输出foo_4bd67d6cd8b8f*///有更多的熵echouniqid(”,true);/*输出4bd67d6cd8b926.12135106*///都有echouniqid(‘bar_',true);/*输出bar_4bd67da367b650.43684647*/

7、序列化

PHP序列化功能大家可能用的比较多,也比较常见,当你需要把数据存到数据库或者文件中是,你可以利用PHP中的serialize()和unserialize()方法来实现序列化和反序列化,代码如下:

//一个复杂的数组$myvar=array(‘hello',42,array(1,'two'),‘apple');//序列化$string=serialize($myvar);echo$string;/*输出a:4:{i:0;s:5:”hello”;i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:”two”;}i:3;s:5:”apple”;}*///反序例化$newvar=unserialize($string);print_r($newvar);/*输出Array([0]=>hello[1]=>42[2]=>Array([0]=>1[1]=>two)[3]=>apple)*/

如何序列化成json格式呢,放心,php也已经为你做好了,使用php5.2以上版本的用户可以使用json_encode()和json_decode()函数来实现json格式的序列化,代码如下:

//acomplexarray$myvar=array(‘hello',42,array(1,'two'),‘apple');//converttoastring$string=json_encode($myvar);echo$string;/*prints["hello",42,[1,"two"],”apple”]*///youcanreproducetheoriginalvariable$newvar=json_decode($string);print_r($newvar);/*printsArray([0]=>hello[1]=>42[2]=>Array([0]=>1[1]=>two)[3]=>apple)*/

8、字符串压缩

当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了gzcompress()和gzuncompress()函数:

$string=“Loremipsumdolorsitamet,consecteturadipiscingelit.Nuncutelitidmiultriciesadipiscing.Nullafacilisi.Praesentpulvinar,sapienvelfeugiatvestibulum,nulladuipretiumorci,nonultricieselitlacusquisante.Loremipsumdolorsitamet,consecteturadipiscingelit.Aliquampretiumullamcorperurnaquisiaculis.Etiamacmassasedturpistemporluctus.Curabitursednibheuelitmolliscongue.Praesentipsumdiam,consecteturvitaeornarea,aliquamanunc.Inidmagnapellentesquetellusposuereadipiscing.Sednonmimetus,atlaciniaaugue.Sedmagnanisi,ornareinmollisin,mollissednunc.Etiamatjustoinleoconguemollis.Nullaminnequeegetmetushendreritscelerisqueeunonenim.Utmalesuadalacuseunullabibendumideuismodurnasodales.“;$compressed=gzcompress($string);echo“Originalsize:“.strlen($string).”n”;/*输出原始大小Originalsize:800*/echo“Compressedsize:“.strlen($compressed).”n”;/*输出压缩后的大小Compressedsize:418*///解压缩$original=gzuncompress($compressed);

几乎有50%压缩比率。同时,你还可以使用gzencode()和gzdecode()函数来压缩,只不用其用了不同的压缩算法。

以上就是8个开发必备的PHP功能,是不是都很实用呢?

展开全部

相关

说两句网友评论
    我要跟贴
    取消