聲明:本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。
歡迎轉載,轉載請註明出處 。
本文地址:http://imsiren.com/archives/617
PHP有一個很強大的Tlog函數:error_log,
我們可以用它來記錄我們程式中出現的錯誤,比如SQL錯誤等。
通過 PHP手冊,我們可以知道,該函數可以向伺服器、檔案或遠程目標發送一個錯誤記錄檔。
它接受四個參數:
error必需。要記錄的錯誤訊息。
type可選。規定錯誤記錄的類型。
可能的記錄類型:
0 – 預設。根據在 php.ini 檔案中的 error_log 配置,錯誤被發送到伺服器日誌系統或檔案。
1 – 錯誤被發送到 destination 參數中的地址。只有該類型使用 headers 參數。
2 – 通過 PHP debugging 串連來發送錯誤。該選項只在 PHP 3 中可用。
3 – 錯誤發送到檔案目標字串。
destination可選。規定向何處發送錯誤訊息。該參數的值依賴於 “type” 參數的值。
headers可選。只在 “type” 為 1 時使用。
規定附加的頭部,比如 From, Cc 以及 Bcc。由 CRLF (\r\n) 分隔。
注釋:在寄送電子郵件時,必須包含 From 頭部。可以在 php.ini 檔案中或者通過此參數設定。
error_log函數支援四種方式記錄錯誤記錄檔
1.到預設的檔案
type為0.
根據在 php.ini 檔案中的 error_log 配置,錯誤被發送到伺服器日誌系統或檔案。
2.郵件
type 為1.
error_log("this is a test string",1,"imsiren@163.com","From:imsiren@163.com");
很簡單,它可以向某個郵箱發送郵件,第三個參數是收件者,第四個是發送人的郵箱
3
通過 PHP debugging 串連來發送錯誤。該選項只在 PHP 3 中可用。
我從來沒用過
4.發送到檔案
type=3
error_log("this is a test string",3,"/home/admin/log/error_log");
這種 方式,是我們經常用到的,將我們指定的錯誤內容寫入到某一個檔案。
==============================================================================
下面看看PHP是如何?的error_log
在ext/tandard/basic_functions.c檔案中:
PHP_FUNCTION(error_log){ char *message, *opt = NULL, *headers = NULL; int message_len, opt_len = 0, headers_len = 0; int opt_err = 0, argc = ZEND_NUM_ARGS(); long erropt = 0; if (zend_parse_parameters(argc TSRMLS_CC, "s|lss", &message, &message_len, &erropt, &opt, &opt_len, &headers, &headers_len) == FAILURE) { return; } if (argc > 1) { opt_err = erropt; } if (opt_err == 3 && opt) { if (strlen(opt) != opt_len) { RETURN_FALSE; } } if (_php_error_log_ex(opt_err, message, message_len, opt, headers TSRMLS_CC) == FAILURE) { RETURN_FALSE; } RETURN_TRUE;}
這個沒什麼說的,檢測傳入過來的參數,然後調用_php_error_log_ex函數。
看看它的定義
PHPAPI int _php_error_log_ex(int opt_err, char *message, int message_len, char *opt, char *headers TSRMLS_DC) /* {{{ */{ php_stream *stream = NULL; switch (opt_err) { case 1: /*send an email */ if (!php_mail(opt, "PHP error_log message", message, headers, NULL TSRMLS_CC)) { return FAILURE; } break; case 2: /*send to an address */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "TCP/IP option not available!"); return FAILURE; break; case 3: /*save to a file */ stream = php_stream_open_wrapper(opt, "a", IGNORE_URL_WIN | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL); if (!stream) { return FAILURE; } php_stream_write(stream, message, message_len); php_stream_close(stream); break; case 4: /* send to SAPI */ if (sapi_module.log_message) { sapi_module.log_message(message); } else { return FAILURE; } break; default: php_log_err(message TSRMLS_CC); break; } return SUCCESS;}
case 1:php_mail函數會根據我們php.ini裡面sendmail_path的配置來發送郵件;
case 2:這個就不說了,我從來沒用過
case 3:通過IO函數寫入到檔案中。
case 4:這個可以通過sapi介面記錄我們的日誌內容
default: 根據 error_log的配置,將日誌寫到該檔案中。。
原文出處:http://imsiren.com/archives/617