那些不曾瞭解的7個PHP函數和功能

一、任意參數數目的函數 創建可以接受任何參數數目的函數。使用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等許多其餘語言兼容。然而對於複雜的對象,某些信息可能會丟失。
相關文章
相關標籤/搜索