【问题标题】:PHP Notice with page URL带有页面 URL 的 PHP 通知
【发布时间】:2012-11-17 13:54:15
【问题描述】:

我在日志中收到了许多 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

我想记录任何信息,当收到通知时,如何记录?

【问题讨论】:

  • 它在您的错误日志中! /usr/home/sdf/data/www/sdfsdf.com/core/test.php on line 156
  • 我错过了什么吗?您通知中的页面是test.php
  • 第 156 行 test.php 发生错误
  • 如果错误日志中没有引用者,请查看您的访问日志
  • 为什么不直接解决问题?

标签: php error-handling


【解决方案1】:

尝试将 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" );

【讨论】:

  • 我尝试了错误处理程序,但它不适用于所有错误,仅适用于自定义 trigger_error?
  • 显示整个世界的应用程序错误数据不是一个好主意。如果他有会话控制,他可以只为他的帐户启用错误报告,这将工作得很好。
  • 这只是一个如何设置错误处理程序的示例......不要逐字逐句。
  • 您可以使用php.net/manual/en/exception.gettraceasstring.php 获得一个不错的堆栈跟踪。
  • 请参阅php.net/manual/en/function.error-reporting.php 以打开error_reporting...只需确保使用自定义错误处理程序(到日志)抑制消息,而不是将其打印到客户端。
【解决方案2】:

您可以做的是将您的 php 通知时间与您的网络服务器访问日志进行比较,以找出导致该通知的 URL。

该通知实际上并不依赖于 URL。 它表明,您正在尝试将“类型”数组转换为字符串,当您执行以下操作时会发生这种情况:

$array = array( 'foo', 'bar' );

echo $array;
$string = 'test' . $array;
printf ( 'foo %s', $array );

【讨论】:

  • 是的,请解释一下。我的回答没有错,它解决了您的问题。总是乐于帮助那些真正需要它的人
  • 有人可能是“swamprunner7”,对这个线程中的每个答案都进行了分析。他们都以某种方式提供了帮助。
【解决方案3】:

要查找此错误特别是,您可以这样做以找出问题所在(包括使用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);
}

或者,使用记录器:

https://stackoverflow.com/a/10800296/247893

【讨论】:

    【解决方案4】:

    您需要设置一些东西来捕获发生的错误/调试信息,而不是向全世界展示。不确定您是否在此应用程序中内置了会话管理,但您可能希望为此练习添加一些基本控件。

    如果您使用包含在多个页面上的函数,有时会更难追踪错误。该错误可能看起来发生在父页面上,但实际上是在函数中触发的,该函数包含在另一个页面上。在这种情况下,错误行号可能会产生误导。

    如果您遇到无法立即隔离的间歇性错误,则可能有助于获得有关脚本中发生的情况的一些反馈。下面是一个粗略的例子,说明如何在函数中进行一些基本的调试:

    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 的会话帐户。

    如果您不使用函数,则需要在脚本的战略区域设置类似的内容,以找出问题发生的时间和地点。

    如果不查看您的整个应用程序,很难给出具体细节。

    【讨论】:

    • 如果有一个url重写指向test.php?网址是什么? (我认为是原来的问题)
    • 他没有向我们提供太多信息——但是是的,这可能是一种可能性。他也可能在多个页面上包含一个文件,并且错误会误导性地指向父页面。
    • @chumkiu PHP 错误日志即使有 URL 重写也会有正确的文件。
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多