如何在PHP中写入控制台?

是否可以写入字符串或日志到控制台?

我的意思是

就像在JSP中一样,如果我们打印类似system.out.println("some")的东西,它将在控制台,而不是在页面上。

1538372 次浏览

火狐

在Firefox上,您可以使用一个名为FirePHP的扩展,它可以将PHP应用程序中的信息记录和转储到控制台。这是一个令人敬畏的web开发扩展Firebug的插件。

然而,如果你使用Chrome浏览器,有一个PHP调试工具称为Chrome记录器webug (webug有问题的日志顺序)。

最近,发条正在积极开发中,它通过添加一个新的面板来提供有用的调试和分析信息,扩展了开发人员工具。它为Laravel 4苗条的2提供了开箱即用的支持,并且可以通过其可扩展API添加支持。

使用Xdebug

调试PHP的更好方法是通过Xdebug。大多数浏览器都提供了辅助扩展来帮助您传递所需的cookie/查询字符串来初始化调试过程。

默认情况下,所有输出都会转到stdout,这是HTTP响应还是控制台,这取决于脚本是由Apache运行还是在命令行上手动运行。但是你可以使用error_log进行日志记录,并且可以用fwrite写入各种I/O流

或者使用PHP调试到控制台中的技巧。

首先需要一个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

还有一个伟大的谷歌Chrome扩展,PHP控制台,与一个PHP库,允许您:

  • 在Chrome JavaScript控制台和弹出的通知中看到错误和异常。
  • 转储任何类型的变量。
  • 远程执行PHP代码。
  • 使用密码保护访问。
  • 根据请求对控制台日志进行分组。
  • 在文本编辑器中跳转到error file:line
  • 将错误/调试数据复制到剪贴板(用于测试人员)。

如果你正在寻找一个简单的方法,echo as JSON:

<script>
console.log(<?= json_encode($foo); ?>);
</script>

试试下面的方法。它正在工作:

echo("<script>console.log('PHP: " . $data . "');</script>");
function phpconsole($label='var', $x) {
?>
<script type="text/javascript">
console.log('<?php echo ($label)?>');
console.log('<?php echo json_encode($x)?>');
</script>
<?php
}

我已经放弃了以上所有的支持调试器,日志记录器。我怎么称赞都不为过!

只需点击右上角的一个标签,或者点击“点击这里”;扩大/隐藏。

注意不同的“类别”。您可以单击任意数组展开/折叠它。

从网页

主要特点:

  • 显示全局变量($ globals, $_POST, $_GET, $_COOKIE等)
  • 显示PHP版本和加载的扩展
  • 替换PHP内置的错误处理程序
  • 记录SQL查询
  • 监视代码和SQL查询的执行时间
  • 检查变量的变化
  • 函数调用跟踪
  • 代码覆盖分析,检查执行了哪些脚本行
  • 转储所有类型的变量
  • 文件检查器与代码高亮显示查看源代码
  • 发送消息到JavaScript控制台(仅限Chrome),用于Ajax脚本

Enter image description here

使用:

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()命令的东西。

我在Ajax应用程序的许多“收集数据并将其转换为XML”中使用了PHP。JavaScript console.log在这种情况下不起作用;它中断XML输出。

Xdebug等也有类似的问题。

我在Windows上的解决方案:

  • 设置一个.txt文件,它比较容易获取和写入
  • 设置.ini文件中的PHP error_log变量写入该文件
  • 在Windows 文件资源管理器中打开该文件,并为其打开预览窗格
  • 使用error_log('myTest'); PHP命令发送消息

这个解决方案很简单,大部分时间都能满足我的需求。标准PHP,并且每次PHP写入预览窗格时,预览窗格都会自动更新。

我发现这很有帮助:

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值限制不太重要的日志来关闭它们。

我认为它可以被用来

function jsLogs($data, $isExit) {
$html = "";
$coll;


if (is_array($data) || is_object($data)) {
$coll = json_encode($data);
} else {
$coll = $data;
}


$html = "<script id='jsLogs'>console.log('PHP: ${coll}');</script>";


echo($html);


if ($isExit) 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"]}

简短简单,适用于数组、字符串或对象。

function console_log( $data ) {
$output  = "<script>console.log( 'PHP debugger: ";
$output .= json_encode(print_r($data, true));
$output .= "' );</script>";
echo $output;
}

这两个都有效:

<?php
$five = 5;
$six = 6;
?>
<script>
console.log(<?php echo $five + $six ?>);
</script>




<?php
$five = 5;
$six = 6;
echo("<script>console.log($five + $six);</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);`

结果截图

另外,一个简单的例子作为一个图像,更容易理解它:

Enter image description here

如果你想写入PHP日志文件,而不是JavaScript控制台,你可以使用这个:

error_log("This is logged only to the PHP log")

参考:error_log

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 页面的例子。

然后输出可能是这样的:

Server log within Firefox DevTools

我正在寻找一种方法来调试我正在开发的 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文件中,然后可以在代码中的任何地方调用。

$variable = "Variable";
echo "<script>console.log('$variable');</script>";

PHP 和 JavaScript 交互。

echo
"<div display='none'>
<script type='text/javascript'>
console.log('console log message');
</script>
</div>";

创建一个

<div>

display="none"

这样就不会显示 div,而是显示

console.log()

函数是在 javascript 中创建的。

对于 Ajax 调用或 XML/JSON 响应,您需要通过 HTTP 头发送日志,然后将它们添加到具有 Web 扩展的控制台,这样就不会影响到主体。这就是 FirePHP (不再可用)和 QuantumPHP (ChromePHP 的一个分支)在 Firefox 中的工作方式。

如果您有耐心,x-debug 是一个更好的选择-您可以更深入地了解 PHP,并能够暂停脚本,查看正在发生的情况,然后继续执行脚本。

这是一个方便的函数。它使用起来非常简单,允许您传递任意类型的任意多个参数,并且将在浏览器控制台窗口中显示对象内容,就像您从 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 请求。

我可能会迟到,但我正在寻找一个日志功能的实现,其中:

  • 接受数量可变的逗号分隔的参数,就像 javascript console.log()一样,
  • 提供格式化输出(不仅仅是序列化字符串) ,
  • 与普通的 javascript console.log()不同。

所以输出是这样的:

enter image description here

(下面的代码片段是在 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);

现在您应该能够在控制台中看到输出,编码愉快:)

虽然这是个老问题,但我一直在找这个。下面是我在这里回答的一些解决方案的汇编,以及在其他地方找到的一些其他想法,可以得到一个放之四海而皆准的解决方案。

密码:

    // 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 insert 将其发布到控制台上。

  • 第二个参数是用于区分正常日志和错误的标志。对于错误,我们添加事件侦听器,以通过警报告知我们是否抛出了任何错误,同时在控制台中高亮显示。此标志默认为 false。

  • 第三个和第四个参数是文件和行号的显式声明,这是可选的。如果不存在,则默认使用预定义的 php 函数 debug_backtrace()为我们获取它们。

  • 下一个函数 exceptions_to_console($svr, $str, $file, $ln)按照 php 默认异常处理程序调用的顺序有四个参数。在这里,第一个参数是严重性,我们进一步使用函数 severity_tag($code)与预定义的常量进行交叉检查,以提供关于错误的更多信息。

注意:

  • 以上代码使用的 JS 函数和方法在旧版浏览器中不可用。为了与旧版本兼容,它需要更换。

  • 以上代码用于测试环境,您可以单独访问站点。不要在现场(生产)网站上使用这个。

建议:

  • 第一个函数 console()抛出了一些通知,因此我将它们包装在另一个函数中,并使用错误控制操作符“@”调用它。如果你不介意这些通知,这是可以避免的。

  • 最后但并非最不重要的是,编码时弹出的警报可能会令人恼火。为此,我使用这个哔哔声(在解决方案: https://stackoverflow.com/a/23395136/6060602中找到)而不是弹出警报。它非常酷,而且有无限的可能性,你可以播放你最喜欢的曲子,让编程更轻松。

简洁、快速、简单,没有无用的代码:

function consolelog($data) {
echo "<script>console.log('".$data."');</script>";
}

简短而简单的 printfjson_encode:

function console_log($data) {
printf('<script>console.log(%s);</script>', json_encode($data));
}

我认为最好的解决办法是使用 error_log(content) 这是输出

编辑2022:

所以我发现了更好的方法,那就是 file_put_contents("php://stdout", content)

它不需要日志信息就可以写

启动代码。

error_reporting(-1);
ini_set('display_errors', 'On');

成功了

it work