如何在PHP中向控制台输出内容?

406

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

我的意思是

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


如果您使用WordPress,我为您提供了一个解决方案 - Martin Braun
30个回答

533

或者你可以使用来自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

7
在 FireFox v27 中,它输出 "Debug Objects: " . $data . "" - Mawg says reinstate Monica
16
如果在输出中出现$data,那么你没有按照所示的函数精确地键入。请仔细查看单引号和双引号,以确保它们与上面的代码匹配。$data是一个PHP变量;在页面发送到浏览器时,该PHP变量将已被传递给debug_to_console的参数替换。 浏览器不应该看到$data。(如果在浏览器中查看“页面源代码”,它不应该显示$data。) - ToolmakerSteve
1
感谢您对我的帖子提供的提示。但是,时间和知识已经改变,函数也有所不同;) 我已经更新了它。 - bueltge
2
OP 表示他想要将内容输出到标准输出,而不是 HTML/JS 控制台。 - beppe9000
4
换句话说,答案是这样的:echo "<script>console.log( '调试对象:" . $output . "' );</script>"; - Christine
显示剩余12条评论

155

Firefox

在Firefox中,你可以使用一个叫做FirePHP的扩展工具,它可以将你的PHP应用程序的信息记录和转储到控制台中。这是一个非常棒的Web开发扩展工具Firebug的附加功能。

Chrome

然而,如果你使用Chrome浏览器,有一个名为Chrome Logger或者webug的PHP调试工具(webug在日志顺序方面存在问题)。

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

使用Xdebug

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

  • Firefox - 最简单的Xdebug
  • Opera - Xdebug
  • Safari - Xdebug切换器

  • 6
    还有一个用于调试PHP的Safari扩展程序叫做Xdebug Helper。我从这个页面安装了它:https://extensions.apple.com/#tab - Mark Mckelvie
    3
    Fire PHP的链接已失效。 - Brian Leishman
    14
    echo "<script> console.log('PHP: ',",get_option("slides_data"),");</script>"; (该段代码的含义是)在控制台输出一个带有"PHP:"前缀和get_option("slides_data")变量值的日志。 - Azmat Karim Khan
    5
    OP 表示他希望将内容输出到标准输出,而非输出到 HTML/JS 控制台。 - beppe9000
    7
    FirePHP 官方已经停止维护。 - TimSparrow
    显示剩余3条评论

    88

    如果你想要一种简单的方法,可以将其作为JSON输出:

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

    5
    这是一个用于调试的函数,可以输出变量的值和标签到浏览器控制台。将变量转换成 JSON 格式并添加漂亮的排版。可以传递两个参数:$object(要输出的变量)和 $label(可选的标签)。如果提供了 $label,则在“Debug”之后会显示该标签。最终输出的字符串会被包含在 JavaScript 的 console.log() 函数中。 - robrecord
    1
    OP 表示他想要将内容输出到标准输出,而不是 HTML/JS 控制台。 - beppe9000
    @beppe9000 这是不正确的。OP问他是否可以从PHP写入控制台。引用:“是否可能将字符串或日志写入控制台?” - Dawson Irvine
    通过使用这个工具,你可以避免使用var_dump等类似的函数。它非常好用,控制台还可以让你以一种很好的方式切换json。 - Mbotet
    这是一个非常优雅的解决方案。 - schizoid04

    55

    请尝试以下方法,它已经可以正常工作:

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

    5
    这并不是实时的,因为PHP在处理完整个页面后才发送所有的内容。此外,如果PHP文件中存在错误,您将无法查看任何日志,因为它只会返回一个错误页面,从而忽略您之前的输出。 - Miro Markaravanes
    1
    我想指出@MiroMarkaravanes是完全正确的 - 致命错误可能会阻止您的console.log输出,除非您确保处理/捕获每个可能的错误。特别是在使用输出缓冲时 - 如果您的缓冲区没有到达屏幕,则您的console.log输出也不会到达。这是需要注意的事情。 - whoshotdk
    1
    OP 表示他想打印到标准输出,而不是 HTML / JS 控制台。 - beppe9000
    我得到了一个“数组”输出,通过 echo("<script>console.log('PHP OUTPUT: " . json_encode($data) . "');</script>"); 进行修复。 - David B

    50

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


    12
    谢谢,我需要使用 error_logPHP内置Web服务器的输出发送到终端。请注意,翻译尽量保持原意和易于理解,不包含任何额外的解释或信息。 - Martín Coll

    32

    作为热门回答中链接网页的作者,我想添加我这个简单助手函数的最新版本。它更加可靠。

    我使用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);`
    

    结果截图

    此外,这里有一个简单的例子图片,更易于理解:

    输入图片描述


    2
    是的,它是纯静态的 PHP,不是 Ajax。 - bueltge
    1
    在发起 AJAX 调用之前,您应该触发辅助函数,这样您也可以在控制台中获得结果。 - bueltge
    看起来当我传递数字值而不是字符串时,它在每个字符后面加了 \n。 - yardpenalty.com
    这是控制台的格式化点,而不是辅助函数的。 - bueltge
    OP 表示他想要将内容打印到服务器端终端/标准输出,而不是 HTML/JS 控制台。 - beppe9000
    显示剩余7条评论

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

    PHP 和 JavaScript 的交互。


    1
    需要解释一下。你能详细说明一下吗?(通过编辑你的回答,而不是在评论中回答)? - Peter Mortensen

    20

    我认为它可以使用 --

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

    3
    非常精致的一篇。谢谢@Pankaj Bisht - Vickar
    2
    需要解释一下。 - Peter Mortensen

    20
    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
    我肯定觉得它非常有帮助! - albert
    保持简单,这个解决方案非常好,因为它是自我解释的。特别是当你像我现在一样有很多事情要处理时。 - Olu Adabonyan
    2
    我不明白为什么需要使用“div”。如果你只有一个<script>块,浏览器中将不会显示任何内容。 - Cave Johnson
    1
    此外,如果您的错误消息存储在变量中,或者包含引号,最好将消息包装在 json.encode 的调用中,以便引号不会破坏您的代码行。例如:echo "<script>console.log(".json_encode($msg).")</script>"; - SherylHohman

    15

    一些很好的答案提供了更深入的信息;但我需要更简单、更像JavaScript console.log()命令的东西。

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

    Xdebug等工具也存在类似的问题。

    我的解决方案是:

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

    这种解决方案简单且大多数时候满足我的需求。标准PHP,预览窗格每次PHP写入时自动更新。


    将消息用 json_encode 包装是否也可以解决问题?如果是的话,可能是消息内部的引号与脚本中的引号发生了干扰。(例如:echo "<script>console.log(".json_encode($msg).")</script>";)。如果不是,请问是什么原因导致 console.log 脚本失败,以及你的解决方案是如何修复这个问题的。你的解决方案很好 - 我只是想更多地了解导致 console.log 或 XML 输出出现错误的条件。在许多情况下,像你这样记录错误日志比快速使用 console.log 更好。 - SherylHohman

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接