是否可以写字符串或登录控制台?
我的意思是说
就像在JSP中一样,如果我们打印system.out.println("some")
,则它将在控制台而不是页面上。
是否可以写字符串或登录控制台?
就像在JSP中一样,如果我们打印system.out.println("some")
,则它将在控制台而不是页面上。
Answers:
火狐浏览器
在Firefox上,您可以使用名为FirePHP的扩展程序,该扩展程序可以将信息从PHP应用程序记录和转储到控制台。这是很棒的Web开发扩展Firebug的附加组件。
铬
但是,如果您使用的是Chrome,则有一个称为Chrome Logger或webug的PHP调试工具(webug的日志顺序有问题)。
最近,Clockwork正在积极开发中,它通过添加新面板来提供有用的调试和配置信息来扩展开发人员工具。它为Laravel 4和Slim 2提供了开箱即用的支持,并且可以通过其可扩展的API添加支持。
使用Xdebug
调试PHP的更好方法是通过Xdebug。大多数浏览器都提供帮助程序扩展,以帮助您传递所需的cookie /查询字符串以初始化调试过程。
或者,您可以使用PHP Debug中的技巧来进行控制台。
首先,您需要一个PHP帮助程序功能
function debug_to_console($data) {
$output = $data;
if (is_array($output))
$output = implode(',', $output);
echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}
然后,您可以像这样使用它:
debug_to_console("Test");
这将创建如下输出:
Debug Objects: Test
"Debug Objects: " . $data . ""
$data
出现在输出中,则说明您输入的功能与显示的完全不同。仔细查看您的单引号和双引号,以确保它们与上面的代码匹配。$data
是一个php变量;在页面发送到浏览器时,该php变量将被传递给的参数所代替debug_to_console
。浏览器永远不会看到$data
。(如果您page source
在浏览器中查看,则不应说$data
。)
如果您正在寻找一种简单的方法,请以JSON回显:
<script>
console.log(<?= json_encode($foo); ?>);
</script>
function debug_log( $object=null, $label=null ){ $message = json_encode($object, JSON_PRETTY_PRINT); $label = "Debug" . ($label ? " ($label): " : ': '); echo "<script>console.log(\"$label\", $message);</script>"; }
请尝试以下方法。这是工作:
echo("<script>console.log('PHP: " . $data . "');</script>");
echo
"<div display='none'>
<script type='text/javascript'>
console.log('console log message');
</script>
</div>";
创建一个
<div>
与
display="none"
这样就不会显示div,但是
console.log()
函数是用javascript创建的。这样您就可以在控制台中收到消息。
div
。如果只有一个<script>
块,则浏览器中将不会显示任何内容。
json.encode
使引号不会破坏您的代码行。例如:echo "<script>console.log(".json_encode($msg).")</script>";
作为流行答案中链接网页的作者,我想添加此简单帮助函数的最新版本。它要牢固得多。
我json_encode()
经常检查变量类型是否不必要,并添加一个缓冲区来解决框架问题。没有可靠的回报或过多使用header()
。
/**
* Simple helper to debug to the console
*
* @param $data object, array, string $data
* @param $context string Optional a description.
*
* @return string
*/
function debug_to_console($data, $context = 'Debug in Console') {
// Buffering to solve problems frameworks, like header() in this and not a solid return.
ob_start();
$output = 'console.info(\'' . $context . ':\');';
$output .= 'console.log(' . json_encode($data) . ');';
$output = sprintf('<script>%s</script>', $output);
echo $output;
}
// $data is the example variable, object; here an array.
$data = [ 'foo' => 'bar' ];
debug_to_console($data);`
还是一个简单的示例,作为理解它的图像要容易得多:
我认为可以使用-
function jsLogs($data) {
$html = "";
$coll;
if (is_array($data) || is_object($data)) {
$coll = json_encode($data);
} else {
$coll = $data;
}
$html = "<script>console.log('PHP: ${coll}');</script>";
echo($html);
# exit();
}
# For String
jsLogs("testing string"); #PHP: testing string
# For Array
jsLogs(array("test1", "test2")); # PHP: ["test1","test2"]
# For Object
jsLogs(array("test1"=>array("subtest1", "subtest2"))); #PHP: {"test1":["subtest1","subtest2"]}
一些很棒的答案可以增加更多的深度;但是我需要更简单,更像JavaScript console.log()
命令的东西。
我在Ajax应用程序中的许多“收集数据并转换为XML”中使用PHP。console.log
在这种情况下,JavaScript 不起作用。它破坏了XML输出。
Xdebug等也有类似的问题。
我在Windows中的解决方案:
.txt
易于获取和写入的文件error_log
在.ini
文件中设置PHP 变量以写入该文件error_log('myTest');
PHP命令发送消息该解决方案很简单,并且大多数时候都可以满足我的需求。标准PHP,并且每次PHP写入预览窗格时都会自动更新。
json_encode
也可以解决问题吗?如果是这样,则可能是消息中的引号干扰了脚本中的引号。(例如:)echo "<script>console.log(".json_encode($msg).")</script>";
。如果不是,我很好奇是什么原因导致console.log脚本中断,以及您的解决方案如何/为什么解决了该问题。您的解决方案很好-我只是想了解更多有关导致console.log
xml输出中断的条件的信息。在许多情况下,您所做的错误日志比quick更好console.log
。
我发现这很有帮助:
function console($data, $priority, $debug)
{
if ($priority <= $debug)
{
$output = '<script>console.log("' . str_repeat(" ", $priority-1) . (is_array($data) ? implode(",", $data) : $data) . '");</script>';
echo $output;
}
}
并像这样使用它:
<?php
$debug = 5; // All lower and equal priority logs will be displayed
console('Important', 1 , $debug);
console('Less Important', 2 , $debug);
console('Even Less Important', 5 , $debug);
console('Again Important', 1 , $debug);
?>
控制台中的哪个输出:
Important Less Important Even Less Important Again Important
您可以通过使用$ debug值限制不重要的日志来关闭它们。
console('Even Less Important' ,6 , $debug);
它将不会在控制台中显示?为什么这样?高于5的任何内容都不会显示
$output = '<script>console.log("' . str_repeat(" ", $priority-1)
和. '");</script>';
。只有implode(",", $data)
和$data
不同。
简短易用,适用于数组,字符串或对象。
function console_log( $data ) {
$output = "<script>console.log( 'PHP debugger: ";
$output .= json_encode(print_r($data, true));
$output .= "' );</script>";
echo $output;
}
function phpconsole($label='var', $x) {
?>
<script type="text/javascript">
console.log('<?php echo ($label)?>');
console.log('<?php echo json_encode($x)?>');
</script>
<?php
}
对于Chrome,有一个名为Chrome Logger的扩展程序,可以记录PHP消息。
Firefox DevTools甚至集成了对Chrome Logger协议的支持。
要启用日志记录,您只需要在项目中保存“ ChromePhp.php”文件。然后可以这样使用:
include 'ChromePhp.php';
ChromePhp::log('Hello console!');
ChromePhp::log($_SERVER);
ChromePhp::warn('something went wrong!');
示例取自GitHub页面。
输出可能如下所示:
"ccampbell/chromephp": "*"
还有一个很棒的Google Chrome扩展程序PHP Console,它带有一个PHP库,可让您:
error file:line
您的文本编辑器。我一直在寻找一种方法来调试我正在开发的WordPress插件中的代码,并遇到了这篇文章。
我从其他响应中获取了最适合我的代码,并将它们组合成一个可用于调试WordPress的函数。该函数是:
function debug_log($object=null, $label=null, $priority=1) {
$priority = $priority<1? 1: $priority;
$message = json_encode($object, JSON_PRETTY_PRINT);
$label = "Debug" . ($label ? " ($label): " : ': ');
echo "<script>console.log('" . str_repeat("-", $priority-1) . $label . "', " . $message . ");</script>";
}
用法如下:
$txt = 'This is a test string';
$sample_array = array('cat', 'dog', 'pig', 'ant', 'fly');
debug_log($txt, '', 7);
debug_log($sample_array);
如果此功能与WordPress开发一起使用,则该功能应放在functions.php
子主题的文件中,然后可以在代码中的任何位置调用。
我放弃了以上所有内容,转而使用Debugger&Logger。我不能称赞它!
只需单击右上角的选项卡之一,或单击“单击此处”以展开/隐藏。
注意不同的“类别”。您可以单击任何数组以展开/折叠它。
从网页
主要特点:
- 显示全局变量($ GLOBALS,$ _ POST,$ _ GET,$ _ COOKIE等)
- 显示PHP版本和已加载的扩展
- 替换PHP内置的错误处理程序
- 记录SQL查询
- 监视代码和SQL查询的执行时间
- 检查变量是否有变化
- 函数调用跟踪
- 代码覆盖率分析,以检查执行脚本的哪几行
- 转储所有类型的变量
- 带有代码荧光笔的文件检查器,可查看源代码
- 将消息发送到JavaScript控制台(仅Chrome),用于Ajax脚本
我对ChromePHP工具进行了一些小的修改,以允许从FirePHP无缝迁移到Firebug,以便通过控制台进行调试。
本文以简单易懂的步骤进行了说明
对于您不想弄乱正文的Ajax调用或XML / JSON响应,您需要通过HTTP标头发送日志,然后使用Web扩展将它们添加到控制台。这就是FirePHP(不再可用)和QuantumPHP(ChromePHP的一个分支)在Firefox中的工作方式。
如果有足够的耐心,x-debug是一个更好的选择-您可以对PHP进行更深入的了解,可以暂停脚本,查看发生了什么,然后继续执行脚本。
我可能参加一个聚会很晚,但是我正在寻找一种实现日志记录功能的方法:
console.log()
,console.log()
。所以输出看起来像这样:
(下面的代码段已在php上进行了测试7.2.11
。我不确定它的php向后兼容性。这也可能是javascript的问题(在旧版浏览器中),因为它会在console.log()
参数后创建尾部逗号-这不是直到合法ES 2017
。)
<?php
function console_log(...$args)
{
$args_as_json = array_map(function ($item) {
return json_encode($item);
}, $args);
$js_code = "<script>console.log('%c 💬 log from PHP: ','background: #474A8A; color: #B0B3D6; line-height: 2',";
foreach ($args_as_json as $arg) {
$js_code .= "{$arg},";
}
$js_code .= ")</script>";
echo $js_code;
}
$list = ['foo', 'bar'];
$obj = new stdClass();
$obj->first_name = 'John';
$obj->last_name = 'Johnson';
echo console_log($list, 'Hello World', 123, $obj);
?>
这是我的解决方案,关于这一点的好处是,您可以根据需要传递尽可能多的参数。
function console_log()
{
$js_code = 'console.log(' . json_encode(func_get_args(), JSON_HEX_TAG) .
');';
$js_code = '<script>' . $js_code . '</script>';
echo $js_code;
}
这样称呼
console_log('DEBUG>>', 'Param 1', 'Param 2');
console_log('Console DEBUG:', $someRealVar1, $someVar, $someArray, $someObj);
现在您应该可以在控制台中看到输出了,编码很愉快:)
采用:
function console_log($data) {
$bt = debug_backtrace();
$caller = array_shift($bt);
if (is_array($data))
$dataPart = implode(',', $data);
else
$dataPart = $data;
$toSplit = $caller['file'])) . ':' .
$caller['line'] . ' => ' . $dataPart
error_log(end(split('/', $toSplit));
}
这是一个方便的功能。它使用起来超级简单,允许您传递任意数量的任意类型的参数,并且将在浏览器控制台窗口中显示对象内容,就像您从JavaScript调用console.log一样,但是从PHP调用
请注意,您也可以通过传递“ TAG-YourTag”来使用标签,并且该标签将一直应用到读取另一个标签,例如“ TAG-YourNextTag”
/*
* Brief: Print to console.log() from PHP
*
* Description: Print as many strings,arrays, objects, and
* other data types to console.log from PHP.
*
* To use, just call consoleLog($data1, $data2, ... $dataN)
* and each dataI will be sent to console.log - note
* that you can pass as many data as you want an
* this will still work.
*
* This is very powerful as it shows the entire
* contents of objects and arrays that can be
* read inside of the browser console log.
*
* A tag can be set by passing a string that has the
* prefix TAG- as one of the arguments. Everytime a
* string with the TAG- prefix is detected, the tag
* is updated. This allows you to pass a tag that is
* applied to all data until it reaches another tag,
* which can then be applied to all data after it.
*
* Example:
*
* consoleLog('TAG-FirstTag', $data, $data2, 'TAG-SecTag, $data3);
*
* Result:
* FirstTag '...data...'
* FirstTag '...data2...'
* SecTag '...data3...'
*/
function consoleLog(){
if(func_num_args() == 0){
return;
}
$tag = '';
for ($i = 0; $i < func_num_args(); $i++) {
$arg = func_get_arg($i);
if(!empty($arg)){
if(is_string($arg) && strtolower(substr($arg, 0, 4)) === 'tag-'){
$tag = substr($arg, 4);
}else{
$arg = json_encode($arg, JSON_HEX_TAG | JSON_HEX_AMP );
echo "<script>console.log('" . $tag . " " . $arg . "');</script>";
}
}
}
}
注意:func_num_args()和func_num_args()是PHP函数,用于读取动态数量的输入参数,并允许该函数从一个函数调用中获取无限多个console.log请求。
尽管这是一个古老的问题,但我一直在寻找。这是我在此处回答的一些解决方案的汇编,以及在别处找到的其他一些想法,以获得一种千篇一律的解决方案。
代码:
// Post to browser console
function console($data, $is_error = false, $file = false, $ln = false) {
if(!function_exists('console_wer')) {
function console_wer($data, $is_error = false, $bctr, $file, $ln) {
echo '<div display="none">'.'<script type="text/javascript">'.(($is_error!==false) ? 'if(typeof phperr_to_cns === \'undefined\') { var phperr_to_cns = 1; document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ alert("Alert. see console."); }, 4000); }); }' : '').' console.group("PHP '.(($is_error) ? 'error' : 'log').' from "+window.atob("'.base64_encode((($file===false) ? $bctr['file'] : $file)).'")'.((($ln!==false && $file!==false) || $bctr!==false) ? '+" on line '.(($ln===false) ? $bctr['line'] : $ln).' :"' : '+" :"').'); console.'.(($is_error) ? 'error' : 'log').'('.((is_array($data)) ? 'JSON.parse(window.atob("'.base64_encode(json_encode($data)).'"))' : '"'.$data.'"').'); console.groupEnd();</script></div>'; return true;
}
}
return @console_wer($data, $is_error, (($file===false && $ln===false) ? array_shift(debug_backtrace()) : false), $file, $ln);
}
//PHP Exceptions handler
function exceptions_to_console($svr, $str, $file, $ln) {
if(!function_exists('severity_tag')) {
function severity_tag($svr) {
$names = [];
$consts = array_flip(array_slice(get_defined_constants(true)['Core'], 0, 15, true));
foreach ($consts as $code => $name) {
if ($svr & $code) $names []= $name;
}
return join(' | ', $names);
}
}
if (error_reporting() == 0) {
return false;
}
if(error_reporting() & $svr) {
console(severity_tag($svr).' : '.$str, true, $file, $ln);
}
}
// Divert php error traffic
error_reporting(E_ALL);
ini_set("display_errors", 1);
set_error_handler('exceptions_to_console');
测试和用途:
用法很简单。包括用于手动发布到控制台的第一个功能。使用第二个功能转移php异常处理。接下来的测试应该给出一个想法。
// Test 1 - Auto - Handle php error and report error with severity info
$a[1] = 'jfksjfks';
try {
$b = $a[0];
} catch (Exception $e) {
echo "jsdlkjflsjfkjl";
}
// Test 2 - Manual - Without explicitly providing file name and line no.
console(array(1 => "Hi", array("hellow")), false);
// Test 3 - Manual - Explicitly providing file name and line no.
console(array(1 => "Error", array($some_result)), true, 'my file', 2);
// Test 4 - Manual - Explicitly providing file name only.
console(array(1 => "Error", array($some_result)), true, 'my file');
说明:
该函数console($data, $is_error, $file, $fn)
将字符串或数组作为第一个参数,然后使用js插入程序将其发布到控制台上。
第二个参数是一个标志,用于区分普通日志和错误。对于错误,我们添加了事件侦听器,以通过警报通知我们是否抛出任何错误,并在控制台中突出显示。此标志默认为false。
第三个和第四个参数是文件和行号的显式声明,这是可选的。如果不存在,则默认情况下使用默认的php函数debug_backtrace()
为我们获取它们。
Next函数exceptions_to_console($svr, $str, $file, $ln)
按php默认异常处理程序调用的顺序具有四个参数。在这里,第一个参数是严重性,我们使用功能进一步交叉检查预定义的常量,severity_tag($code)
以提供有关错误的更多信息。
注意 :
上面的代码使用的JS函数和方法在旧版浏览器中不可用。为了与旧版本兼容,需要替换。
上面的代码用于测试环境,您一个人就能访问该站点。请勿在实时(生产)网站中使用此功能。
建议:
第一个函数console()
发出了一些通知,因此我将它们包装在另一个函数中,并使用错误控制运算符“ @”对其进行了调用。如果您不注意这些通知,可以避免这种情况。
最后但并非最不重要的一点是,在编码时弹出的警报可能很烦人。为此,我正在使用此提示音(可在解决方案中找到:https : //stackoverflow.com/a/23395136/6060602),而不是弹出警报。它非常酷,可能性无穷无尽,您可以播放自己喜欢的音乐并减轻编码的压力。