如何在PHP中写入控制台?


323

是否可以写字符串或登录控制台?

我的意思是说

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

Answers:


145

火狐浏览器

在Firefox上,您可以使用名为FirePHP的扩展程序,该扩展程序可以将信息从PHP应用程序记录和转储到控制台。这是很棒的Web开发扩展Firebug的附加组件。

但是,如果您使用的是Chrome,则有一个称为Chrome Loggerwebug的PHP调试工具(webug的日志顺序有问题)。

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

使用Xdebug

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


5
还有一个用于调试PHP的Safari扩展程序,称为Xdebug Helper。我是从以下页面安装的:extensions.apple.com/#tab
Mark Mckelvie 2013年

3
Fire PHP链接已失效
Brian Leishman

9
回声“ <script> console.log('PHP:',”,get_option(“ slides_data”),“); </ script>”;
阿兹玛特·卡里姆·汗

4
OP表示他想打印到标准输出,而不是html / js控制台。
beppe9000 '17

6
FirePHP正式死亡。
TimSparrow

406

或者,您可以使用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

5
在FireFox v27中,它输出"Debug Objects: " . $data . ""
Mawg说恢复Monica 2014年

使其更有用的唯一方法是在日志中进行变量$ name:'data'对。功能不错。
势在必行的2014年

10
@Mawg(以及支持该评论的人):如果$data出现在输出中,则说明您输入的功能与显示的完全不同。仔细查看您的单引号和双引号,以确保它们与上面的代码匹配。$data是一个php变量;在页面发送到浏览器时,该php变量将被传递给的参数所代替debug_to_console。浏览器永远不会看到$data。(如果您page source在浏览器中查看,则不应说$data。)
ToolmakerSteve15年

1
感谢您对我的帖子的提示。但是时间和知识已经改变,功能也;)我现在对其进行了更新。
bueltge '16

3
因此,换句话说,答案是这样的:echo“ <script> console.log('Debug Objects:”。$ output。“''); </ script>”;
克里斯汀

68

如果您正在寻找一种简单的方法,请以JSON回显:

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

4
这增加了更多的上下文: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>"; }
robrecord '17

OP表示他想打印到标准输出,而不是html / js控制台。
beppe9000 '17

@ beppe9000那是不正确的。OP询问他是否可以从PHP写入控制台。Quote:“可以写字符串还是登录控制台?”
道森·欧文

这样可以避免var_dumps和类似的东西。效果很好,控制台可让您以一种不错的方式切换json。
Mbotet


37

请尝试以下方法。这是工作:

echo("<script>console.log('PHP: " . $data . "');</script>");

5
这不是很实时,因为php一旦完成处理就会发送所有页面。此外,如果php文件中有错误,您甚至都不会看到任何日志,因为它只会返回错误页面,从而忽略了您之前的打印内容。
米罗Markaravanes 2014年

1
我想指出的是@MiroMarkaravanes是绝对正确的-致命错误会阻止console.log输出,除非您确保处理/捕获每个可能的错误。特别是在使用输出缓冲时-如果您的缓冲区没有进入屏幕,console.log的输出也不会。这是要注意的事情。
whoshotdk

1
OP表示他想打印到标准输出,而不是html / js控制台。
beppe9000 '17

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

创建一个

<div>

display="none"

这样就不会显示div,但是

console.log()

函数是用javascript创建的。这样您就可以在控制台中收到消息。


3
从技术上讲,这是对最初问题的正确答案-如何从PHP写入浏览器控制台。但是我认为作者正在尝试调试PHP,因此有更好的选择。但是,严格意义上来说,这是不正确的答案,但不应被否决。
罗夫(Rolf)

1
我当然只是发现它非常有用!
阿尔伯特

保持简单,此解决方案很棒,因为它可以自我解释。尤其是当您有很多需要同时咀嚼的时间时,
Olu Adabonyan

2
我不明白为什么你甚至需要一个div。如果只有一个<script>块,则浏览器中将不会显示任何内容。
Kodos Johnson

1
另外,如果您的错误消息存储在变量中,或者它包含引号,则最好将消息包装在一个调用中,以json.encode使引号不会破坏您的代码行。例如:echo "<script>console.log(".json_encode($msg).")</script>";
SherylHohman

18

作为流行答案中链接网页的作者,我想添加此简单帮助函数的最新版本。它要牢固得多。

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);`

结果截图

还是一个简单的示例,作为理解它的图像要容易得多:

在此处输入图片说明


虽然我这样的想法,你可以确认它不会对Ajax请求是合适的?
Mawg说恢复Monica

1
是的,它是纯静态php,不是Ajax。
bueltge '16

但是,似乎是在页面正文中添加了HML / JS代码-我的Ajax没有返回任何页面正文。抱歉,但我不愿意尝试帮助我
莫格说应

1
您应该在请求ajax调用之前触发helper函数,然后在控制台中也得到结果。
bueltge '16

因此,我在其中放置了一个变量,每个字符都以自己的行结尾。为什么要这样做呢?从未使用过console.info
yardpenalty.com,2016年

17

我认为可以使用-

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"]}

3
非常复杂的一个。感谢@Pankaj Bisht
Vickar '18

2
一个解释将是有条理的。
彼得·莫滕森

14

一些很棒的答案可以增加更多的深度;但是我需要更简单,更像JavaScript console.log()命令的东西。

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

Xdebug等也有类似的问题。

我在Windows中的解决方案:

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

该解决方案很简单,并且大多数时候都可以满足我的需求。标准PHP,并且每次PHP写入预览窗格时都会自动更新。


将消息包装起来json_encode也可以解决问题吗?如果是这样,则可能是消息中的引号干扰了脚本中的引号。(例如:)echo "<script>console.log(".json_encode($msg).")</script>";。如果不是,我很好奇是什么原因导致console.log脚本中断,以及您的解决方案如何/为什么解决了该问题。您的解决方案很好-我只是想了解更多有关导致console.logxml输出中断的条件的信息。在许多情况下,您所做的错误日志比quick更好console.log
SherylHohman

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

PHP和JavaScript交互。


一个解释将是有条理的。您能否详细说明(通过编辑答案,而不是通过评论来回答)?
彼得·莫滕森

11

我发现这很有帮助:

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的任何内容都不会显示
HattrickNZ

2
@HattrickNZ这是为了让您拥有不同级别的日志消息。如果您正在调试,则可能希望显示带有大量信息的非常闲聊的消息流,但是在正常操作期间,您可以将debug设置为1,这样您只会得到显示的最重要的错误/日志项。由您决定在编写代码时哪些项目很重要。
Toby Allen

OP表示他想打印到标准输出,而不是html / js控制台。
beppe9000 '17

1
是的,但是应该重构重复的代码(冗余):$output = '<script>console.log("' . str_repeat(" ", $priority-1). '");</script>';。只有implode(",", $data)$data不同。
彼得·莫滕森

1
@Peter Mortensen-真实的故事!在4yo帖子中对此进行了编辑!:)
zee

7

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

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

1
OP表示他想打印到服务器端终端/标准输出,而不是html / js控制台。
beppe9000 '17

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

1
OP表示他想打印到服务器端终端/标准输出,而不是html / js控制台。
beppe9000 '17


6

对于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页面

输出可能如下所示:

Firefox DevTools中的服务器日志


您也可以通过composer安装它:"ccampbell/chromephp": "*"
padawanTony

5

还有一个很棒的Google Chrome扩展程序PHP Console,它带有一个PHP库,可让您:

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

1
我首选的将PHP错误,异常和用户定义的调试输出写入JS控制台的方法。我使用它已有多年-高度可靠,并且与PHP版本保持同步。我什么也不会用。
Velojet

3

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


2

我放弃了以上所有内容,转而使用Debugger&Logger。我不能称赞它!

只需单击右上角的选项卡之一,或单击“单击此处”以展开/隐藏。

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

从网页

主要特点:

  • 显示全局变量($ GLOBALS,$ _ POST,$ _ GET,$ _ COOKIE等)
  • 显示PHP版本和已加载的扩展
  • 替换PHP内置的错误处理程序
  • 记录SQL查询
  • 监视代码和SQL查询的执行时间
  • 检查变量是否有变化
  • 函数调用跟踪
  • 代码覆盖率分析,以检查执行脚本的哪几行
  • 转储所有类型的变量
  • 带有代码荧光笔的文件检查器,可查看源代码
  • 将消息发送到JavaScript控制台(仅Chrome),用于Ajax脚本

在此处输入图片说明


你好 是否有最新的叉或类似工具,且最新且最新维护?
Metafaniel

我没有编写代码,所以对于最新的fork,我想只是去GitHub?有关替代方法,请访问softwarerecs.stackexchange.com,我们将为您提供帮助。
Mawg说恢复Monica 18'Nov

1
@MawgHi,谢谢。我问是因为phptoolcase Github和其中列出的fork在5年内没有更新。感谢其他StackExchange网站。我刚找到Clockwork。我想知道它是相似还是更好...
Metafaniel '18

并感谢的发条。它看起来很棒(可惜我没有使用任何这些框架(我想知道这是否是通过挂钩框架转储数据库查询的方式))。非常值得调查。(+1)
Mawg说恢复Monica


2

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

如果有足够的耐心,x-debug是一个更好的选择-您可以对PHP进行更深入的了解,可以暂停脚本,查看发生了什么,然后继续执行脚本。



2

我可能参加一个聚会很晚,但是我正在寻找一种实现日志记录功能的方法:

  • 需要可变数量的逗号分隔参数,就像javascript console.log()
  • 提供格式化的输出(不仅是序列化的字符串),
  • 与普通的javascript有区别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);

?>

此代码片段救了我。:)我需要在不访问实际服务器的情况下对生产代码进行一些更改,这是解决该问题的完美之选。谢谢!
拉斐尔·阿莱索

我很高兴能够提供帮助。
HynekS

1

这两个中的任何一个都有效:

<?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>");
?>

1

这是我的解决方案,关于这一点的好处是,您可以根据需要传递尽可能多的参数。

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);

现在您应该可以在控制台中看到输出了,编码很愉快:)


0

采用:

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));
}

1
您应该添加有关您的想法和解决方案的提示。源也有未使用的源。
bueltge '16

0

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


0

尽管这是一个古老的问题,但我一直在寻找。这是我在此处回答的一些解决方案的汇编,以及在别处找到的其他一些想法,以获得一种千篇一律的解决方案。

代码:

    // 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),而不是弹出警报。它非常酷,可能性无穷无尽,您可以播放自己喜欢的音乐并减轻编码的压力。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.