关于调试:如何在PHP中写入控制台?

How can I write to the console in PHP?

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

我的意思是

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


或者,您可以使用PHP Debug中的技巧来进行控制台。

首先,您需要一些PHP帮助程序功能

1
2
3
4
5
6
7
function debug_to_console($data) {
    $output = $data;
    if (is_array($output))
        $output = implode(',', $output);

    echo"console.log('Debug Objects:" . $output ."' );";
}

然后,您可以像这样使用它:

1
debug_to_console("Test");

这将创建如下输出:

1
Debug Objects: Test


火狐浏览器

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

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

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

使用Xdebug

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

  • Chrome-Xdebug助手
  • Firefox-最简单的Xdebug
  • 歌剧-Xdebug
  • Safari-Xdebug Toggler


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

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


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


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

1
echo("console.log('PHP:" . $data ."');");


1
2
3
4
5
6
echo
"
    <script type='text/javascript'>
        console.log('console log message');
   
"
;

创建一个

1
 

1
display="none"

这样就不会显示div,但是

1
console.log()

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


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

我使用json_encode()来检查是否不需要变量类型,并且还添加了一个缓冲区来解决框架问题。没有可靠的回报或header()的过多使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * 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('%s', $output);

    echo $output;
}

用法

1
2
3
// $data is the example variable, object; here an array.
$data = [ 'foo' => 'bar' ];
debug_to_console($data);`

结果截图

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

Enter image description here


我认为可以使用-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function jsLogs($data) {
    $html ="";
    $coll;

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

    $html ="console.log('PHP: ${coll}');";

    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。在这种情况下,JavaScript console.log无效。它破坏了XML输出。

Xdebug等也有类似的问题。

我在Windows中的解决方案:

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

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


我发现这很有帮助:

1
2
3
4
5
6
7
8
9
function console($data, $priority, $debug)
{
    if ($priority <= $debug)
    {
        $output = 'console.log("' . str_repeat("", $priority-1) . (is_array($data) ? implode(",", $data) : $data) . '");';

        echo $output;
    }
}

并像这样使用它:

1
2
3
4
5
6
7
<?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);
?>

控制台中的哪个输出:

1
2
3
4
Important
 Less Important
     Even Less Important
Again Important

您可以通过使用$ debug值限制不重要的日志来关闭它们。


1
2
$variable ="Variable";
echo"console.log('$variable');";

PHP和JavaScript交互。


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

1
2
3
4
5
6
function console_log( $data ) {
  $output  ="console.log( 'PHP debugger:";
  $output .= json_encode(print_r($data, true));
  $output .="' );";
  echo $output;
}


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


如果要写入PHP日志文件,而不是JavaScript控制台,则可以使用以下命令:

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

参考:error_log


对于Chrome,有一个名为Chrome Logger的扩展程序,可以记录PHP消息。

Firefox DevTools甚至集成了对Chrome Logger协议的支持。

要启用日志记录,您只需要在项目中保存" ChromePhp.php"文件。然后可以这样使用:

1
2
3
4
include 'ChromePhp.php';
ChromePhp::log('Hello console!');
ChromePhp::log($_SERVER);
ChromePhp::warn('something went wrong!');

示例取自GitHub页面。

输出可能如下所示:

Server log within Firefox DevTools


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

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


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

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

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

从网页

Main features:

  • Show globals variables ($GLOBALS, $_POST, $_GET, $_COOKIE, etc.)
  • Show PHP version and loaded extensions
  • Replace PHP built in error handler
  • Log SQL queries
  • Monitor code and SQL queries execution time
  • Inspect variables for changes
  • Function calls tracing
  • Code coverage analysis to check which lines of script where executed
  • Dump of all types of variable
  • File inspector with code highlighter to view source code
  • Send messages to JavaScript console (Chrome only), for Ajax scripts

Enter image description here


我一直在寻找一种方法来调试我正在开发的WordPress插件中的代码,并遇到了这篇文章。

我从其他响应中获取了最适用于我的代码,并将它们组合成一个可用于调试WordPress的函数。该函数是:

1
2
3
4
5
6
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"console.log('" . str_repeat("-", $priority-1) . $label ."'," . $message .");";
}

用法如下:

1
2
3
4
$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文件中,然后可以在代码中的任何位置调用该功能。


截至2017年,Firebug以及FirePHP已被禁用。

我对ChromePHP工具进行了一些小的修改,以允许从FirePHP无缝迁移到Firebug,以便通过控制台进行调试。

本文通过简单易懂的步骤进行了说明

在5分钟内从FirePHP迁移到ChromePHP(无需破坏现有代码)


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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    $five = 5;
    $six = 6;
?>

    console.log(<?php echo $five + $six ?>);



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

这是一个方便的功能。它使用起来超级简单,允许您传递任意数量的任意类型的参数,并且将在浏览器控制台窗口中显示对象内容,就像您从JavaScript调用console.log一样,但是从PHP调用

请注意,您也可以通过传递" TAG-YourTag"来使用标签,该标签将一直应用到读取另一个标签,例如" TAG-YourNextTag"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
 *  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"console.log('" . $tag ."" . $arg ."');";
            }
        }
    }
}

注意:func_num_args()和func_num_args()是PHP函数,用于读取动态数量的输入参数,并允许该函数从一个函数调用中获取无限多个console.log请求。


采用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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));
}