You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
6.1 KiB
172 lines
6.1 KiB
<?php
|
|
|
|
$defaults = array(
|
|
// how many spaces to use for indention, 0 will make it use real tabs
|
|
'tabsize' => 4,
|
|
|
|
// whitelist of IPs which don't need to be authenticated
|
|
// use '*' to allow any IP
|
|
'ip_whitelist' => array('127.0.0.1', '::1'),
|
|
);
|
|
|
|
if (file_exists(__DIR__.'/config.php')) {
|
|
$options = include __DIR__.'/config.php';
|
|
$options = array_merge($defaults, $options);
|
|
} else {
|
|
$options = $defaults;
|
|
}
|
|
|
|
/**
|
|
* PHP Console
|
|
*
|
|
* A web-based php debug console
|
|
*
|
|
* Copyright (C) 2010, Jordi Boggiano
|
|
* http://seld.be/ - j.boggiano@seld.be
|
|
*
|
|
* Licensed under the new BSD License
|
|
* See the LICENSE file for details
|
|
*
|
|
* Source on Github http://github.com/Seldaek/php-console
|
|
*/
|
|
if (!in_array('*', $options['ip_whitelist'], true) &&
|
|
!in_array($_SERVER['REMOTE_ADDR'], $options['ip_whitelist'], true)
|
|
) {
|
|
header('HTTP/1.1 401 Access unauthorized');
|
|
die('ERR/401 Go Away');
|
|
}
|
|
|
|
define('PHP_CONSOLE_VERSION', '1.4.0');
|
|
require 'krumo/class.krumo.php';
|
|
|
|
ini_set('log_errors', 0);
|
|
ini_set('display_errors', 1);
|
|
error_reporting(E_ALL | E_STRICT);
|
|
|
|
$debugOutput = '';
|
|
|
|
if (isset($_POST['code'])) {
|
|
if (get_magic_quotes_gpc()) {
|
|
$code = stripslashes($code);
|
|
}
|
|
|
|
// Important: replace only line by line, so the generated source lines will map 1:1 to the initial user input!
|
|
$code = preg_replace('{^\s*<\?(php)?\s*}i', '', $_POST['code']);
|
|
|
|
// if there's only one line wrap it into a krumo() call
|
|
if (preg_match('#^(?!var_dump|echo|print|< )([^\r\n]+?);?\s*$#is', $code, $m) && trim($m[1])) {
|
|
$code = 'krumo('.$m[1].');';
|
|
}
|
|
|
|
// replace '< foo' by krumo(foo)
|
|
$code = preg_replace('#^<\s+(.+?);?[\r\n]?$#m', 'krumo($1);', $code);
|
|
|
|
// replace newlines in the entire code block by the new specified one
|
|
// i.e. put #\r\n on the first line to emulate a file with windows line
|
|
// endings if you're on a unix box
|
|
if (preg_match('{#((?:\\\\[rn]){1,2})}', $code, $m)) {
|
|
$newLineBreak = str_replace(array('\\n', '\\r'), array("\n", "\r"), $m[1]);
|
|
$code = preg_replace('#(\r?\n|\r\n?)#', $newLineBreak, $code);
|
|
}
|
|
|
|
ob_start();
|
|
$memBefore = memory_get_usage(true);
|
|
$start = microtime(true);
|
|
|
|
eval($code);
|
|
|
|
// compare with peak, because regular memory could be free'd already
|
|
$end = microtime(true);
|
|
$memAfter = memory_get_peak_usage(true);
|
|
$debugOutput .= ob_get_clean();
|
|
|
|
if (isset($_GET['js'])) {
|
|
header('Content-Type: text/plain');
|
|
|
|
$memory = sprintf('%.3f', ($memAfter - $memBefore) / 1024.0 / 1024.0); // in MB
|
|
$rendertime = sprintf('%.3f', (($end - $start) * 1000)); // in ms
|
|
|
|
header('X-Memory-Usage: '. $memory);
|
|
header('X-Rendertime: '. $rendertime);
|
|
|
|
echo $debugOutput;
|
|
die('#end-php-console-output#');
|
|
}
|
|
}
|
|
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
<title>Debug Console</title>
|
|
<link rel="stylesheet" type="text/css" href="styles.css" />
|
|
<script src="jquery-1.9.1.min.js"></script>
|
|
<script src="ace/ace.js" charset="utf-8"></script>
|
|
<script src="ace/mode-php.js" charset="utf-8"></script>
|
|
<script src="php-console.js"></script>
|
|
<script>
|
|
$.console({
|
|
tabsize: <?php echo json_encode($options['tabsize']) ?>
|
|
});
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div class="output"><?php echo $debugOutput ?></div>
|
|
<form method="POST" action="">
|
|
<div class="input">
|
|
<textarea class="editor" id="editor" name="code"><?php echo (isset($_POST['code']) ? htmlentities($_POST['code'], ENT_QUOTES, 'UTF-8') : "<?php\n\n") ?></textarea>
|
|
<div class="statusbar">
|
|
<span class="position">Line: 1, Column: 1</span>
|
|
<span class="copy">
|
|
Copy selection: <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="110" height="14" id="clippy">
|
|
<param name="movie" value="clippy/clippy.swf"/>
|
|
<param name="allowScriptAccess" value="always" />
|
|
<param name="quality" value="high" />
|
|
<param name="scale" value="noscale" />
|
|
<param NAME="FlashVars" value="text=">
|
|
<param name="bgcolor" value="#E8E8E8">
|
|
<embed src="clippy/clippy.swf"
|
|
width="110"
|
|
height="14"
|
|
name="clippy"
|
|
quality="high"
|
|
allowScriptAccess="always"
|
|
type="application/x-shockwave-flash"
|
|
pluginspage="http://www.macromedia.com/go/getflashplayer"
|
|
FlashVars="text="
|
|
bgcolor="#E8E8E8"
|
|
/>
|
|
</object>
|
|
</span>
|
|
<a href="" class="reset">Reset</a>
|
|
<span class="runtime-info"></span>
|
|
</div>
|
|
</div>
|
|
<input type="submit" name="subm" value="Try this!" />
|
|
</form>
|
|
<div class="help">
|
|
debug:
|
|
< foo()
|
|
krumo(foo());
|
|
</div>
|
|
<div class="help">
|
|
commands:
|
|
krumo::backtrace();
|
|
krumo::includes();
|
|
krumo::functions();
|
|
krumo::classes();
|
|
krumo::defines();
|
|
</div>
|
|
<div class="help">
|
|
misc:
|
|
press ctrl-enter to submit
|
|
put '#\n' on the first line to enforce
|
|
\n line breaks (\r\n etc work too)
|
|
</div>
|
|
<div class="footer">
|
|
php-console v<?php echo PHP_CONSOLE_VERSION ?> - by <a href="http://seld.be/">Jordi Boggiano</a> - <a href="http://github.com/Seldaek/php-console">sources on github</a>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
|