一、任意參數數目的函數 創建可以接受任何參數數目的函數。使用func_get_args()函數:如下爲引用的內容: function foo(){ $args=func_get_args(); foreach($args as $k=>$v){ echo「arg」.($k+1).」:$v\n」; } } 二、使用Glob()查找文件 許多PHP函數具備長描述性的名稱。然而可能會很難說出glob()函數能作的事情,除非你已經經過屢次使用並熟悉了它。能夠把它看做是比scandir()函數更強大的版本,能夠按照某種模式搜索文件。如下爲引用的內容: $files=glob('*.php'); print_r($files); /*outputlookslike: Array ( [0]=>phptest.php [1]=>pi.php [2]=>post_output.php [3]=>test.php ) */ 三、內存使用信息 經過偵測腳本的內存使用狀況,有利於代碼的優化。PHP提供了一個垃圾收集器和一個很是複雜的內存管理器。腳本執行時所使用的內存量,有升有跌。爲了獲得當前的內存使用狀況,咱們可使用memory_get_usage()函數。 若是須要得到任意時間點的最高內存使用量,則可使用memory_limit()函數。 如下爲引用的內容: echo「Initial:「.memory_get_usage().」bytes\n」; /*prints Initial:361400bytes */ //let’suseupsomememory for($i=0;$i<100000;$i++){ $array[]=md5($i); } //let'sremovehalfofthearray for($i=0;$i<100000;$i++){ unset($array[$i]); } echo"Final:".memory_get_usage()."bytes\n"; /*prints Final:885912bytes */ echo"Peak:".memory_get_peak_usage()."bytes\n"; /*prints Peak:13687072bytes */ 四、CPU使用信息 爲此,咱們要利用getrusage()函數。請記住這個函數不適用於Windows平臺。如下爲引用的內容: print_r(getrusage()); /*prints 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 ) 這可能看起來有點神祕,除非你已經有系統管理員權限。如下是每一個值的具體說明(你不須要記住這些):如下爲引用的內容: ru_oublock:blockoutputoperations ru_inblock:blockinputoperations ru_msgsnd:messagessent ru_msgrcv:messagesreceived ru_maxrss:maximumresidentsetsize ru_ixrss:integralsharedmemorysize ru_idrss:integralunshareddatasize ru_minflt:pagereclaims ru_majflt:pagefaults ru_nsignals:signalsreceived ru_nvcsw:voluntarycontextswitches ru_nivcsw:involuntarycontextswitches ru_nswap:swaps ru_utime.tv_usec:usertimeused(microseconds) ru_utime.tv_sec:usertimeused(seconds) ru_stime.tv_usec:systemtimeused(microseconds) ru_stime.tv_sec:systemtimeused(seconds) 要知道腳本消耗多少CPU功率,咱們須要看看‘usertime’和’systemtime’兩個參數的值。秒和微秒部分默認是單獨提供的。你能夠除以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); /*prints Usertime:0.011552 Systemtime:0 */ 儘管腳本運行用了大約3秒鐘,CPU使用率卻很是很是低。由於在睡眠運行的過程當中,該腳本實際上不消耗CPU資源。還有許多其餘的任務,可能須要一段時間,但不佔用相似等待磁盤操做等CPU時間。所以正如你所看到的,CPU 使用率和運行時間的實際長度並不老是相同的。下面是一個例子: 如下爲引用的內容: //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); /*prints Usertime:1.424592 Systemtime:0.004204 */ 這花了大約1.4秒的CPU時間,但幾乎都是用戶時間,由於沒有系統調用。系統時間是指花費在執行程序的系統調用時的CPU開銷。下面是一個例子:如下爲引用的內容: $start=microtime(true); //keepcallingmicrotimeforabout3seconds while(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); /*prints Usertime:1.088171 Systemtime:1.675315 */ 五、魔術常量 PHP提供了: 獲取當前行號(__LINE__)、 文件路徑(__FILE__)、 目錄路徑(__DIR__)、 函數名(__FUNCTION__)、 類名(__CLASS__)、 方法名(__METHOD__)、 命名空間(__NAMESPACE__) 等有用的魔術常量。當包含其餘腳本文件時,使用__FILE__常量(或者使用PHP5.3新具備的__DIR__常量): 如下爲引用的內容: //thisisrelativetotheloadedscript'spath //itmaycauseproblemswhenrunningscriptsfromdifferentdirectories require_once('config/database.php'); //thisisalwaysrelativetothisfile'spath //nomatterwhereitwasincludedfrom require_once(dirname(__FILE__).'/config/database.php'); 使用__LINE__使得調試更爲輕鬆。你能夠跟蹤到具體行號。 如下爲引用的內容: //somecode //... my_debug("somedebugmessage",__LINE__); /*prints Line4:somedebugmessage */ //somemorecode //... my_debug("anotherdebugmessage",__LINE__); /*prints Line11:anotherdebugmessage */ functionmy_debug($msg,$line){ echo"Line$line:$msg 六、生成惟一標識符 某些場景下,可能須要生成一個惟一的字符串。我看到不少人使用md5()函數,即便它並不徹底意味着這個目的:如下爲引用的內容: //generateuniquestring echomd5(time().mt_rand(1,1000000)); ThereisactuallyaPHPfunctionnameduniqid()thatismeanttobeusedforthis. //generateuniquestring echouniqid(); /*prints 4bd67c947233e */ //generateanotheruniquestring echouniqid(); /*prints 4bd67c9472340 */ 你可能會注意到,儘管字符串是惟一的,前幾個字符倒是相似的,這是由於生成的字符串與服務器時間相關。但實際上也存在友好的一方面,因爲每一個新生成的ID會按字母順序排列,這樣排序就變得很簡單。爲了減小重複的機率,你能夠傳遞一個前綴,或第二個參數來增長熵。如下爲引用的內容: //withprefix echouniqid('foo_'); /*prints foo_4bd67d6cd8b8f */ //withmoreentropy echouniqid('',true); /*prints 4bd67d6cd8b926.12135106 */ //both echouniqid('bar_',true); /*prints bar_4bd67da367b650.43684647 */ 這個函數將產生比md5()更短的字符串,能節省一些空間。 七、序列化 你有沒有遇到過須要在數據庫或文本文件存儲一個複雜變量的狀況?你可能沒能想出一個格式化字符串並轉換成數組或對象的好方法,PHP已經爲你準備好此功能。有兩種序列化變量的流行方法。下面是一個例子,使用serialize()和unserialize()函數。如下爲引用的內容: //acomplexarray $myvar=array( 'hello', 42, array(1,'two'), 'apple' ); //converttoastring $string=serialize($myvar); echo$string; /*prints 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";} */ //youcanreproducetheoriginalvariable $newvar=unserialize($string); print_r($newvar); /*prints Array ( [0]=>hello [1]=>42 [2]=>Array ( [0]=>1 [1]=>two ) [3]=>apple ) */ 這是原生的PHP序列化方法。然而,因爲JSON近年來大受歡迎,PHP5.2中已經加入了對JSON格式的支持。如今你可使用json_encode()和json_decode()函數,如下爲引用的內容: //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); /*prints Array ( [0]=>hello [1]=>42 [2]=>Array ( [0]=>1 [1]=>two ) [3]=>apple ) */ 這將更爲行之有效,尤爲與JavaScript等許多其餘語言兼容。然而對於複雜的對象,某些信息可能會丟失。