2014年2月27日 星期四

PHP 使用 error_log 除錯‏

一般 PHP 要 debug 時,最直接的方法,是使用 echo、var_dump、print_r 輸出變數的內容。進階一點的方法,也可以使用 Xdebug 來觀察程式的執行過程,但使用 Xdebug,除了需要其它額外設定之外,也要學習怎麼使用。

有時候,我拿到一個很陌生的程式,想觀察程式執行時,某些變數的變化。
但觀察的過程,又不想輸出在畫面上,因為輸出在畫面上時,可能讓畫面跑版,
若是輸出在 AJAX 的 response,也可能讓原本解析 AJAX response 的 JavaScript 產生錯誤。

所以,當我不想影響原本程式的輸出,只想默默觀察變數的值時,我都會用 error_log() 將變數內容輸出到其它檔案。尤其同一流程需要連續操作多次,再一併觀察數值的變化時,這個方法也蠻方便的。

程式碼如下:
使用時,先在 php 檔案新增以下程式碼,並於該目錄下建立 debug_log 資料夾,用來存放輸出結果。
if(1){ // 不使用時,改成 if(0)
    $log_dir = dirname(__FILE__) . '/debug_log'; // 存放 erro_log 輸出結果的目錄
    $log_file = $log_dir . "/" . date("Y-m-d") . ".txt"; // 存放 erro_log 輸出結果的 txt 檔
    if (!file_exists($log_file)) {
        $fp_log = fopen($log_file, "w");
        chmod($log_file, 0777);
        fclose($fp_log);
    }
    
    ini_set('error_log', $log_file);
    ini_set('log_errors', 1);
}

// 將變數使用 var_dump 輸出
function lstr($v){
    ob_start();
    var_dump($v);
    $str = ob_get_clean();
    return $str;
}

使用時
$myVar = "test";
$myArray = array("a", "b", "c");

error_log($myVar);
error_log(lstr($myArray)); // 如果變數是array,用自訂的 lstr() 函式輸出,避免只輸出"Array"字串

輸出結果 debug_log/2014-02-27.txt
[27-Feb-2014 03:36:12] test

[27-Feb-2014 03:36:12] array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

沒有留言:

張貼留言