我在日志中收到了许多 PHP 通知,但我想知道发生了什么页面 URL 通知,我如何记录这些信息?
[29-Nov-2012 13:58:29] PHP Notice: Array to string conversion in /usr/home/sdf/data/www/sdfsdf.com/core/test.php on line 156
我想记录任何信息,当收到通知时,如何记录?
我在日志中收到了许多 PHP 通知,但我想知道发生了什么页面 URL 通知,我如何记录这些信息?
[29-Nov-2012 13:58:29] PHP Notice: Array to string conversion in /usr/home/sdf/data/www/sdfsdf.com/core/test.php on line 156
我想记录任何信息,当收到通知时,如何记录?
尝试将 php 错误日志中的时间戳与您的 Web 服务器访问日志相关联。
或者,您可以tail -f 日志并触发随机页面。
或者,设置自定义错误处理程序来记录各种数据。
http://php.net/manual/en/function.set-error-handler.php
function myErrorHandler( $errno, $errstr, $errfile, $errline ){
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting
return;
}
switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
}
set_error_handler( "myErrorHandler" );
您需要设置一些东西来捕获发生的错误/调试信息,但不要向全世界展示。不确定您是否在此应用程序中内置了会话管理,但您可能希望为此练习添加一些基本控件。
如果您使用包含在多个页面上的功能,有时更难追踪错误。该错误可能看起来发生在父页面上,但实际上是在函数中触发的,该函数包含在另一个页面上。在这种情况下,错误行号可能会产生误导。
如果您遇到无法立即隔离的间歇性错误,则可能有助于获得有关脚本中正在发生的事情的一些反馈。这是一个关于如何在函数中进行一些基本调试的粗略示例:
function get_func_argNames($funcName)
{
$f = new ReflectionFunction($funcName);
$result = array();
foreach ($f->getParameters() as $param)
{
$result[] = $param->name;
}
return $result;
}
function myCoolFunction($arg1, $arg2, $arg3)
{
$debug = false;
$php_function_args = implode(', ',get_func_argNames(__FUNCTION__));
$_debug_txt = "<b><span style='color:blue;'>function</span> <span style='color:darkblue;'>" .__FUNCTION__. "</span></b>($php_function_args)";
if ($debug)
{
EmailAppDev($_debug_txt);
}
// myCoolFunction
$x = $arg1 + $arg2 + $arg3;
return $x
}
理想情况下,您将拥有一个可以控制为谁启用 $debug 的会话帐户。
如果您不使用函数,则需要在脚本的战略区域中设置类似的内容,以找出问题的时间和地点。
如果没有查看整个应用程序,很难给出细节。
您可以做的是将您的 php 通知时间与您的网络服务器访问日志进行比较,以找出导致该通知的 URL。
该通知实际上看起来并不依赖于 URL。它表明,您正在尝试将“类型”数组转换为字符串,当您执行以下操作时会发生这种情况:
$array = array( 'foo', 'bar' );
echo $array;
$string = 'test' . $array;
printf ( 'foo %s', $array );
要特别查找此错误,您可以这样做以找出问题所在(包括使用 打印回溯debug_backtrace
):
if (is_string($var)) {
//Then it's OK - do whatever you were doing on line 156
} else {
//Something's wrong! Let's log it to some file!
ob_start();
var_dump($var);
print_r(debug_backtrace());
echo "\n----------------------------------------------\n";
$debugContent = ob_get_clean();
$logHandle = fopen("wrong_var_type.log", "a");
if ($logHandle !== false) {
fwrite($logHandle, $debugContent . "\n");
}
@fclose($logHandle);
}
或者,使用记录器: