PHP:将警告存储到日志文件中,而不创建个人set_error_handler

时间:2016-02-01 00:51:48

标签: php error-handling warnings

您是否有任何想法 - 如果可能的话 - 如何在日志文件中存储警告,就像发生致命错误一样?

实施例。代码:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL | E_STRICT);

[...]
error_log($try = buildLog(), 3, "errors_log/php_errors.log");
[...]

function buildLog() { 
    // Get time of request
    if( ($time = $_SERVER['REQUEST_TIME']) == '') {
       $time = time();
    }
 // Get IP address
    if( ($remote_addr = $_SERVER['REMOTE_ADDR']) == '') {
       $remote_addr = "REMOTE_ADDR_UNKNOWN";
    }
 // Get requested script
    if( ($request_uri = $_SERVER['REQUEST_URI']) == '') {
       $request_uri = "REQUEST_URI_UNKNOWN";
    }

    echo "************** CHECK ***************";
    $errMy = error_get_last();
    $debug = print_r($errMy, TRUE);  
    echo "<br>".$debug;
    echo "************** CHECK ***************";

    // Format the date and time
    $date = date("Y-m-d H:i:s", $time);

    $message = "\n"."Here is problem: $debug"."\n"."$date - $remote_addr - $request_uri "."\n";

    return $message;
 };
 [...]

在这种情况下,例如,我收到了这些日志:

 Here is problem: Array 
 (
[type] => 2 [message] => Missing argument 1 for buildLog(), called in /.../file.php on line 45 and defined
[file] => /.../file.php
[line] => 729
 ) - 2016-02-01 01:09:39 - 93.40.189.183 /.../file.php

因为我有一个致命的错误,但我无法得到这个:

 Warning:     
 fopen(http://.../file.php) [function.fopen]: failed to open stream: HTTP request failed! 
 HTTP/1.0 404 Not Found in /.../file.php on line 78

这是我收到正在运行的页面的警告,因为:

 ini_set('display_errors', 1);
 ini_set('display_startup_errors', 1);
 error_reporting(E_ALL | E_STRICT);

UPDATE v.1.1

测试你的建议我发现了一种应变行为。 这是代码:

 [...]
 error_reporting(0);

 $url = "http://.../test.php";  
 echo "<br>";
 print_r($url);     
 $child1j10 = fopen($url, 'r');
 if ($child1j10 == FALSE) {
    echo ("<br><b>ERROR:</b> couldn't get file, so I'll retry"."\n"."".$url."\n"."".fopen($url, 'r'));
    $errMy2 = error_get_last();
    $debug2 = print_r($errMy2, TRUE);  
    echo "<br>".$debug2;
 };
    echo_flush();

即使使用error_reporting(0),更准确地说,这显示了正确的警告信号:

 ERROR: couldn't get file, so I'll retry  http:/.../test.php 

 Array ( [type] => 2 [message] => fopen(http:/.../test.php) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found [file] => /.../test.php [line] => 80)

但是如果我稍后在oder的代码中使用error_get_last()来获取日志文件中的写入,则它不起作用。 我的下一部分代码是:

 error_log($prova = buildLog(), 3, "errors_log/php_errors.log");
 //BUILD LOG MESSAGE
 function buildLog(){
 [... get all data...]  
 echo "************** CHECK ***************";
 $errMy = error_get_last();
 $debug = print_r($errMy, TRUE);  
 //echo "<br>".$debug;
 echo "************** CHECK ***************";

 // Format the date and time
 $date = date("Y-m-d H:i:s", $time);

 $message = "\n"."Here is problem: $debug"."\n"."$date - $remote_addr - $request_uri "."\n";

 return $message;
 };

并且日志仅报告:

 Here is problem: 
 2016-02-01 02:45:55 - 93.40.189.183 - /.../test.php

在“问题”和“数据”之间应该有从error_get_last()生成的数组

再一次。

更新v.1 - 解决方案

我们走了。 对不起您的失去的时间,我觉得有点愚蠢。

问题是我必须稍后将函数调用放在代码中,而不是像我想的那样(我认为它有点像“服务器”代码)。

这部分:

 error_log($test = buildLog(), 3, "errors_log/php_errors.log"); 

通过这种方式,我能够获取日志文件中的所有报告。

1 个答案:

答案 0 :(得分:2)

您必须使用内置函数trigger_error

  

用于触发用户错误条件,它可以与内置错误处理程序一起使用,或者与已设置为新错误处理程序的用户定义函数(set_error_handler())一起使用。

     

当您需要在运行时生成对异常的特定响应时,此函数非常有用。

编辑:

要将文本保存到标准错误日志,您可以使用error_log。请注意,根据系统和/或服务器配置,可以将消息发送到不同的目标。