怎樣成為PHP高手(2)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:概述怎樣用新PHP插件實現MySQL為基礎的事務
      事務處理支持很長時間以來一直是大多數MySQL開發者的心愿,隨著MySQL 4.0的發布,這個心愿最后終于得以實現。MySQL 4.0后不久,擁有一個新的MySQL插件的PHP 5.x也發布了。這個新插件,MySQL Improved,使得PHP開發者通過利用本地的PHP函數,獲得了這些新的事

      調試PHP程序的另外一種重要的方法就是查看Log信息。如果能夠方便地控制Log信息的級別以及Log信息的顯示內容,將會給程序調試帶來更多的便利。下面的幾個函數可以方便地實現這個功能。

      $ss_log_level = 0;

      $ss_log_filename = /tmp/ss-log;

      $ss_log_levels = array(

      NONE => 0,

      ERROR => 1,

      INFO => 2,

      DEBUG => 3);

      function ss_log_set_level ($level = ERROR) {

      global $ss_log_level;

      $ss_log_level = $level;

      }

      function ss_log ($level, $message) {

      global $ss_log_level, $ss-log-filename;

      if ($ss_log_levels[$ss_log_level] < $ss_log_levels[$level]) {

      // 不顯示Log信息

      return false;

      }

      $fd = fopen($ss_log_filename, "a ");

      fputs($fd, $level. - [.ss_timestamp_pretty().] - .$message."n");

      fclose($fd);

      return true;

      }

      function ss_log_reset () {

      global $ss_log_filename;

      @unlink($ss_log_filename);

      }

      在上面的函數中,有四個Log級別變量。運行PHP程序時,只有當Log的級別低于預設的級別值時,Log信息才可以被記錄和顯示出來。例如,在程序中加入如下的一條語句:

      ss_log_set_level(INFO);

      那么,運行PHP程序時,只有ERROR和INFO級別的LOG信息才能被記錄和顯示出來,DEBUG級的信息則被忽略了。除此之外,我們還可以設定顯示的信息內容,其語句如下:

      ss_log(ERROR, "testing level ERROR");

      ss_log(INFO, "testing level INFO");

      ss_log(DEBUG, "testing level DEBUG");

      你也可以隨時使用下面的語句清空LOG信息:

      ss_log_reset();

      4.速度測試函數

      為了優化代碼,我們需要一種可以測試代碼運行時間的方法,從而來選擇最優的代碼。下面的函數可以測試運行代碼所需的時間:

      function ss_timing_start ($name = default) {

      global $ss_timing_start_times;

      $ss_timing_start_times[$name] = explode( , microtime());

      }

      function ss_timing_stop ($name = default) {

      global $ss_timing_stop_times;

      $ss_timing_stop_times[$name] = explode(, microtime());

      }

      function ss_timing_current ($name = default) {

      global $ss_timing_start_times, $ss_timing_stop_times;

      if (!isset($ss_timing_start_times[$name])) {

      return 0;

      }

      if (!isset($ss_timing_stop_times[$name])) {

      $stop_time = explode(, microtime());

      }

      else {

      $stop_time = $ss_timing_stop_times[$name];

      }

      $current = $stop_time[1] - $ss_timing_start_times[$name][1];

      $current = $stop_time[0] - $ss_timing_start_times[$name][0];

      return $current;

      }

      現在可以輕松地檢查任何一段代碼的執行時間了,甚至我們可以同時使用多個計時器,只需在使用上述的幾個函數時設定不同的參數作為計時器的名稱就可以了。

      5.調試和優化數據庫的操作

      對于數據庫來說,運行速度是至關重要的。盡管很多書籍和文章都講授了一些快速運行數據庫的方法,但是所有的方法都必須經過實踐的檢驗。下面我們將把PHPLib函數庫中的query()函數和上面介紹的幾個函數綜合起來編寫成新的query()函數,和原先的函數相比,這個函數增加了運行時間的監測功能。

      function query($Query_String, $halt_on_error = 1) {

      $this->connect();

      ss_timing_start();

      $this->Query_ID = @mysql_query($Query_String,$this->Link_ID);

      ss_timing_stop();

      ss_log(INFO, ss_timing_current(). Secs - .$Query_String);

      $this->Row = 0;

      $this->Errno = mysql_errno();

      $this->Error = mysql_error();

      if ($halt_on_error && !$this->Query_ID) {

      $this->halt("Invalid SQL: ".$Query_String);

      }

      return $this->Query_ID;

      }

      二、編寫漂亮的代碼

      1.將后臺程序與前端程序分開

      在編寫PHP程序時,有些代碼是用來處理一些事務,例如操作數據庫、進行數學運算等,而另外的一些代碼則只是事務處理的結果顯示出來,例如一些使用echo語句將結果以HTML的格式顯示在Web瀏覽器上的PHP代碼以及那些直接嵌入PHP程序的HTML代碼。首先我們應該清晰地區分這兩種代碼,把前者稱為后臺程序,把后者稱為前端程序。

      因為PHP是一種嵌入式編程語言,也就是說,所有的PHP代碼都可以嵌入到HTML代碼之中,這為程序的編寫帶來了許多便利之處。但是,“物極必反”,如果在一段較長的程序中將PHP代碼和HTML代碼混合編寫,這將使程序雜亂無章,不利于程序的維護和閱讀。所以我們需要盡可能地將這些程序中混雜于HTML代碼中的PHP代碼移植出來,在專門的文件中將這些代碼封裝成函數,然后在HTML代碼中使用include語句來包含這些文件,在適當的位置調用這些函數即可。

      這種做法一方面使HTML代碼和PHP代碼都簡單易讀,另一方面因為HTML代碼需要不斷更新,而這種分離的方法可以確保后臺程序不會被破壞。

      同前端程序不同,后臺程序更多追求的是穩定、結構化,極少更改,所以應該認真地設計和管理。其實,在設計臺程序時,投入大量時間是值得的,“現在栽樹,以后乘涼”,在以后的設計工作中將可以輕松地使用現在編寫的后臺程序。

      2.靈活使用包含文件

      正如前面所說的那樣,后臺程序應當安排在一系列的包含文件中。包含文件可以通過include語句在需要時動態裝入,也可以在php.ini文件中通過使用auto_prepend_file指令預先自動裝入。

      如果使用后一種方法的話,雖然取得了一勞永逸的好處,但是也有一些缺點值得我們注意。下面的一段代碼向我們展示了解析一個龐大的包含文件需要一定的時間:

      require(timing.inc);

      ss_timing_start();

      include(test.inc);

      ss_timing_stop();

      echo

      .ss_timing_current().

      ;

      ?>

      在上面的代碼中,test.inc是一個1000行的包含文件,運行的結果顯示,解析這個包含文件花費了0.6秒鐘,對于一個大型網站來說,這個速度并不是可以忽略不記的。

      使用包含文件的另外一個缺點是:如果一個文件中的一個語句發生錯誤,將會使整個網站的PHP程序都無法運行。所以使用起來也及其小心。

      其實,對包含文件稍做處理,即可以使包含文件只在需要時進行解析。下面的代碼使abc.inc文件只在程序需要時才作解析:

      if ( defined( __LIBA_INC) ) return;

      define( __LIBA_INC, 1 );

      /*

      * 代碼...

      */

      ?>

      3.使用面向對象的編程方法

      PHP也是一種面向對象的語言,面向對象的編程方法是優秀的程序員們非常推崇的一種軟件設計方法,在PHP編程中可以充分發揮面向對象語言的優勢,對編程中的對象進行封裝。在前面的代碼中,我們使用了面向對象的方法,例如在管理數據庫時,我們將query()函數封裝進數據庫類中,這極大地方便了代碼的管理,增加了程序的可讀性。

      分享:如何在PHP中執行系統外部命令
      PHP作為一種服務器端的腳本語言,象編寫簡單,或者是復雜的動態網頁這樣的任務,它完全能夠勝任。但事情不總是如此,有時為了實現某個功能,必須借助于操作系統的外部程序(或者稱之為命令),這樣可以做到事半功倍。 那么,是否可以在PHP腳本中調用外部命令呢

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-06-18
      相關PHP教程