Web lists-archives.com

[PHP] Re: feature-request : html + css logging in apache logs (example for the rest of the unix community too)




all are donated to public domain :

__FILE__==='functions__internalErrorHandling.php';
<?php
require_once (dirname(__FILE__).'/1.0.0/functions.php');
require_once (dirname(__FILE__).'/functions__basicErrorHandling.php');

function woError ($errCode, $errMsgOrArray) {
if (is_array($errMsgOrArray)) {

if (ob_get_length()>0) ob_end_flush();
ob_start();
var_dump ($errMsgOrArray);
$errMsg = ob_get_clean();
} else if (
is_string($errMsgOrArray)
|| is_int($errMsgOrArray)
|| is_float($errMsgOrArray)
) {
$errMsg = '' . $errMsgOrArray;
} else if (
is_bool($errMsgOrArray)
) {
$errMsg = (
$errMsgOrArray
? 'TRUE'
: 'FALSE'
);
}
//echo 't1200';
//echo '<pre>'; var_dump (debug_backtrace()); echo '</pre>'; in badResult()
instead
trigger_error ($errMsg, $errCode);
}

function woBasicErrorHandler ($errno, $errstr, $errfile, $errline,
$errcontext) {
  //echo 'woBasicErrorHandler.main:start';
$stacktrace = debug_backtrace();
$errType = wo_php_errorType_humanReadable($errno);
$errSeverity = 'woErrorSeverity__error';
if (stripos($errType, 'warning')!==false) $errSeverity =
'woErrorSeverity__warning';
if (stripos($errType, 'notice')!==false) $errSeverity =
'woErrorSeverity__notice';

if (stripos($errType, 'user')!==false) $errSeverity .= '
woErrorSeverity__user';
if (stripos($errType, 'parse')!==false) $errSeverity .= '
woErrorSeverity__parse';
if (stripos($errType, 'core')!==false) $errSeverity .= '
woErrorSeverity__core';
if (stripos($errType, 'compile')!==false) $errSeverity .= '
woErrorSeverity__compile';
$html =
'<div class="woError '.$errSeverity.'"><h1>webappObfuscator error</h1>'
.'<p>'.$errType.' : '.$errstr.'</p>'
.woBasicErrorHandler__prettyStacktrace ($stacktrace)
.'</div>';
echo $html;
//reportStatus (1, $html); // RV : where the F is that function??
die();
/*
echo '<h1>dfo error</h1><p>'.errorType_humanReadable($errno).' :
'.$errstr.'<br/>stacktrace:</p><pre>';
var_dump ($stacktrace);
echo '</pre>';*/
}

function woBasicErrorHandler__prettyStacktrace ($st) {
global $errorsBasepath;
$r =
'<div class="woStacktrace">'
.'<span class="woStacktrace__basePath">All filenames are under :
'.$errorsBasepath.'</span><br/>';
foreach ($st as $stackNumber => $stackData) {
if (array_key_exists('file', $stackData)) {
$relPath = '...'.str_replace($errorsBasepath, '', $stackData['file']);
} else {
$relPath = '.../';
};
if (array_key_exists('line', $stackData)) {
$line = '<span class="woStacktrace__line">(line
'.$stackData['line'].')</span>';
} else {
$line = '';
}
$file = '<span class="woStacktrace__file">__FILE__ : '.$relPath.'</span> ';
$function =
'<span class="woStacktrace__function">'.$stackData['function'].'( '
.(
array_key_exists('args',$stackData)
? woBasicErrorHandler__prettyStacktrace__arguments ($stackData['args'])
: ''
)
.' )</span>';
//if ($stackNumber > 0) { // ignore the call to saBasicErrorHandler() itself
$r .=
'<div class="woStacktrace__item">'
.$file.' '
.$line.' calls '
.$function
.'</div>';
//}
};
$r .= '</div>';
return $r;
}

function woBasicErrorHandler__prettyStacktrace__arguments ($args) {
$r = '<span class="woStacktrace__args">';
foreach ($args as $argIdx => $arg) {
if (is_array($arg)) {
$r .= '<span
class="woStacktrace__arg">'.htmlentities(json_encode($arg)).'</span>';
} elseif (is_object($arg)) {
$r .= '<span
class="woStacktrace__arg">'.htmlentities(json_encode($arg)).'</span>';
} else {
$r .= '<span class="woStacktrace__arg">'.htmlentities($arg).'</span>';
}
$r .= '<span class="woStacktrace__argSeperator">, </span>';
}
$r .= '</span>';
return $r;
}

function wo_php_json_last_error_humanReadable ($errNo) {
// taken from http://php.net/manual/en/function.json-last-error.php
// on 2015 July 9th, valid for php version up to 5.5.0
$errorTypes = array (
JSON_ERROR_NONE => array (
'errorCode' => 'JSON_ERROR_NONE',
'msg' => 'No error has occurred'
),
JSON_ERROR_DEPTH => array (
'errorCode' => 'JSON_ERROR_DEPTH',
'msg' => 'The maximum stack depth has been exceeded'
),
JSON_ERROR_STATE_MISMATCH => array (
'errorCode' => 'JSON_ERROR_STATE_MISMATCH',
'msg' => 'Invalid or malformed JSON'
),
JSON_ERROR_CTRL_CHAR => array (
'errorCode' => 'JSON_ERROR_CTRL_CHAR',
'msg' => 'Control character error, possibly incorrectly encoded'
),
JSON_ERROR_SYNTAX => array (
'errorCode' => 'JSON_ERROR_SYNTAX',
'msg' => 'Syntax error'
),
JSON_ERROR_UTF8 => array (
'errorCode' => 'JSON_ERROR_UTF8',
'msg' => 'Malformed UTF-8 characters, possibly incorrectly encoded'
)/*,
JSON_ERROR_RECURSION => array (
'errorCode' => 'JSON_ERROR_RECURSION',
'msg' => 'One or more recursive references in the value to be encoded'
),
JSON_ERROR_INF_OR_NAN => array (
'errorCode' => 'JSON_ERROR_INF_OR_NAN',
'msg' => 'One or more NAN or INF values in the value to be encoded'
),
JSON_ERROR_UNSUPPORTED_TYPE => array (
'errorCode' => 'JSON_ERROR_UNSUPPORTED_TYPE',
'msg' => 'A value of a type that cannot be encoded was given'
)*/
);
if ($errNo===0) {
$r = $errorTypes[0];
} else {
$r =
array_key_exists ($errNo, $errorTypes)
? $errorTypes[$errNo]
: array (
'errorCode' => 'ERROR_UNKNOWN_ERROR',
'msg' => 'json_last_error() returned a code that is unknown to
fucntions__basicErrorHandling.php::wo_php_json_last_error_humanReadable()'
);
};
return $r;
}

function wo_php_errorType_humanReadable ($errNo) {

    if (phpversion() < '4.0.0') {
$errorTypes = array (
1   =>  'Error',
2   =>  'Warning',
4   =>  'Parsing Error',
8   =>  'Notice',
    2047   => 'E_ALL'
);
    } elseif (phpversion() < '5.0.0') {
$errorTypes = array (
1   =>  'Error',
2   =>  'Warning',
4   =>  'Parsing Error',
8   =>  'Notice',
16  =>  'Core Error',
32  =>  'Core Warning',
64  =>  'Compile Error',
128 =>  'Compile Warning',
256 =>  'User Error',
512 =>  'User Warning',
1024=>  'User Notice',
2047=> 'E_ALL'
);

    } elseif (phpversion() < '5.2.0') {
$errorTypes = array (
1   =>  'Error',
2   =>  'Warning',
4   =>  'Parsing Error',
8   =>  'Notice',
16  =>  'Core Error',
32  =>  'Core Warning',
64  =>  'Compile Error',
128 =>  'Compile Warning',
256 =>  'User Error',
512 =>  'User Warning',
1024=>  'User Notice',
2048=> 'Strict',
2047=> 'E_ALL'
);

    } elseif (phpversion() < '5.3.0') {
$errorTypes = array (
1   =>  'Error',
2   =>  'Warning',
4   =>  'Parsing Error',
8   =>  'Notice',
16  =>  'Core Error',
32  =>  'Core Warning',
64  =>  'Compile Error',
128 =>  'Compile Warning',
256 =>  'User Error',
512 =>  'User Warning',
1024=>  'User Notice',
2048=> 'Strict',
4096=> 'Recoverable',
6143=> 'E_ALL'
);

    } elseif (phpversion() >= '5.3.0' && phpversion() < '6.0.0') {
$errorTypes = array (
1   =>  'Error',
2   =>  'Warning',
4   =>  'Parsing Error',
8   =>  'Notice',
16  =>  'Core Error',
32  =>  'Core Warning',
64  =>  'Compile Error',
128 =>  'Compile Warning',
256 =>  'User Error',
512 =>  'User Warning',
1024=>  'User Notice',
2048=> 'Strict',
4096=> 'Recoverable',
8192=> 'Depracated',
      16384=> 'User-level Depracated',
      30719=> 'E_ALL'
);

    } elseif (phpversion() >= '6.0.0') {
$errorTypes = array (
1   =>  'Error',
2   =>  'Warning',
4   =>  'Parsing Error',
8   =>  'Notice',
16  =>  'Core Error',
32  =>  'Core Warning',
64  =>  'Compile Error',
128 =>  'Compile Warning',
256 =>  'User Error',
512 =>  'User Warning',
1024=>  'User Notice',
2048=> 'Strict',
4096=> 'Recoverable',
8192=> 'Depracated',
      16384=> 'User-level Depracated',
      32767=> 'E_ALL'
);
    }

    return $errorTypes[$errNo];
}

?>

__FILE__==='functions__internalErrorHandling.php';

<?php
/*---
  this is my way of providing quality runtime debugging info
(to the computerprogram itself, to developers, to end-users)
and -even more important- creating robust computerprograms that
can be debugged quickly when they break when they're faced with the
unexpected.
a future version of this will email all the *releveant* debug details
to the developer(s) whenever the unexpected hits the computer program using
this.
draft of this extension is detailed in
webappObfuscator-1.0.0.php:::webappObfuscator::readTokens()
*/

function badResult ($errNo, $errMeta=null) {
if (
 is_string($errNo)
 || is_array($errNo)
) {
 $errMeta = $errNo;
 $errNo = E_USER_ERROR;
 $errMeta['additionalError'] = 'badResult called with no $errNo as first
parameter';
};
if (is_string($errMeta)) {
$errMeta = array ('msg'=>$errMeta);
};
//$errMeta = filterArgs($errMeta, $filterSettings);

$e = array (
'isMetaForFunc' => true,
'phpErrorClass' => $errNo,
'phpErrorType' => wo_php_errorType_humanReadable ($errNo),
'error' => $errMeta,
);
$traceData = debug_backtrace();
$e['backtrace'] =
$traceData;//phpFilterBacktraceData($traceData,$filterSettings);
$e['globals'] = getGlobals();
//var_dump ($e);
/*if (function_exists('saError')) {
 echo 'error handler === saError()';
 saError ($errNo, $errMeta); // http://seductiveapps.com
} else*/if (function_exists('woError')) {
 echo 'error handler === woError()';
 woError ($errNo, $errMeta);
} else {
 echo 'functions__internalErrorHandling.php::no error handler specified,
var_dump-ing.<pre>';
 var_dump ($e);
 echo '</pre>';
}
return $e;
}

function getGlobals() {
$r = array (
'$_GET' => $_GET,
'$_POST' => $_POST,
'$_COOKIE' => $_COOKIE
);
return $r;
}

function good($r) {
return (
is_array($r)
&& array_key_exists('result',$r)
);
}

//function &result(&$r) {
function &result(&$r) {
return $r['result'];
}

function &resultArray (&$r) {
  $r2 = array();
  foreach ($r as $k => $v) {
    $r2[$k] = result($v);
  }
  return $r2;
}


function &goodResult(&$r) {
$r2 = array (
'isMetaForFunc' => true,
'result' => &$r
);
return $r2;
}
?>

__FILE__==='errorHandling_css_forLightBackgrounds.css'
.woError { border : 2px solid red; border-radius : 5px; padding : 5px;
background : yellow; color : red; }
.woStacktrace { font-size : 90%; font-weight : bold; }
.woStacktrace__basePath { color : purple; }
.woStacktrace__item { }
.woStacktrace__file { color : navy; }
.woStacktrace__function { color : #002300; }
.woStacktrace__line { color : blue;  }
.woStacktrace__args { color : navy; font-weight : normal; }
.woStacktrace__arg { color : blue; }
.woStacktrace__argSeperator { color : purple; background : white;
font-weight : bold; font-size : 100%; }


__FILE__==='errorHandling_css_forDarkOrSemitransparentBackgrounds.css'
.woError { border : 2px solid red; border-radius : 5px; padding : 5px;
background : yellow; color : red; opacity : 0.767 }
.woStacktrace { font-size : 90%; font-weight : bold; }
.woStacktrace__basePath { color : purple; }
.woStacktrace__item { }
.woStacktrace__file { color : navy; }
.woStacktrace__function { color : #002300; }
.woStacktrace__line { color : blue;  }
.woStacktrace__args { color : navy; font-weight : normal; }
.woStacktrace__arg { color : blue; }
.woStacktrace__argSeperator { color : purple; background : white;
font-weight : bold; font-size : 100%; }

On Sun, Aug 28, 2016 at 5:16 AM, Rene Veerman <
rene.veerman.netherlands@xxxxxxxxx> wrote:

> nothing's better than cut-n-pasting, i knooow :)
>
> so in the next few messages i'll include my own PHP handlers.. it's 4
> files, which i'll just post as ordinary text.. dunno and dont wanna test if
> attaching works to the entire list architecture (web caches and stuff)..
>
> On Sun, Aug 28, 2016 at 5:07 AM, Rene Veerman <rene.veerman.netherlands@
> gmail.com> wrote:
>
>> Hi.
>>
>> Once again, thanks for keeping PHP free to use and so widely and easily
>> installed..
>>
>> I have another feature request (sent earlier tonight)..
>>
>> I quite often, much more than i like, *need* a stacktrace and *proper*
>> variable listings for each function called in PHP when it barfs out nothing
>> more than an apache error log entry..
>> And can we please show such entries in the browser *as well as the apache
>> log*? Or if nothing else, *just* in the browser?
>>
>> Rather than going "all the way" and making variable contents (which can
>> grow quite large) collapsable and shit *right away*, you could simply add
>> the right <span> and <p> class="" names and supply a CSS file. I use it in
>> all error handling that does make it to set_error_handler(myHandler), and
>> that really is what makes things like my obfuscator (also posted about to
>> the php-general@xxxxxxxxxxxxx earlier tonight) possible.
>> And taking things that far allows guys like me to provide you with a
>> collapsable large-JSON-decoding viewer addon for such logfiles later (rest
>> assured that that'll get done once you do this for me).. i call it
>> jsonViewer and i should have it back up at http://seductiveapps.com/tools
>> /json (or /jsonViewer) once the obfuscator is fully done in a few weeks,
>> at most..
>>
>> if you want me to build (and opensource) things like that true-obfuscator
>> and my JSON scalable database architecture using just apache2+ and php5+,
>> it would really cut my development time in more than half if you could add
>> "all of this" (it's deadsimple and a few hours work imo) to the next
>> versions of PHP (and please make it the default, you can include sample CSS
>> or read in a CSS file that you set in php.ini (comment on how to do this in
>> the logfile html please))..
>>
>> see https://github.com/seductiveapps/folderDB/blob/master/todo.
>> platform.txt for all relevant updates concerning these developments
>> mentioned here..
>>
>> Thanks in advance for considering and likely adopting the 2 small changes
>> i need in the next versions of PHP.. I run ubuntu btw.. I'll be checking
>> the php.net pages for your future updates..
>>
>> If anyone can gimme a duration-to-completion for each of my requests of
>> tonight, that'd be awesome. I'll take a "wild guess", or any serious
>> objections that i might be able to sway out of the way..
>>
>>
>