声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。 http://imsiren.com/archives/617 php有一个很强大的日志处理函数:error_log, 我们可以用它来记录我们程序中出现的错误,比如sql错误等。 通过 php手册,我们可以知道,该函数可以向服务
声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
http://imsiren.com/archives/617
php有一个很强大的日志处理函数: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