在PHP内置的Web服务器中打印内容

40
在Python内置的Web服务器中,当在函数中使用print时,它会在终端中打印结果...
例如:
Django version 1.3.4, using settings 'parsicore.settings'
Development server is running at http://0.0.0.0:8000/
Using the Werkzeug debugger (http://werkzeug.pocoo.org/)
Quit the server with CONTROL-C.


127.0.0.1 - - [16/Jan/2013 02:02:08] "GET / HTTP/1.1" 200 -
hello ... print 1 2 3 

如何在PHP内置Web服务器中打印类似这样的内容?

例如,我想要在终端打印 $_POST。我使用 php -S 127.0.0.1:3000 运行PHP内置Web服务器。

4个回答

46
只需要将数据输入到 error_log() 中:

error_log(print_r($_REQUEST, true));
好的,请提供需要翻译的内容。

38

内置于 PHP 5.4+ 的开发 Web 服务器 并不按照您想要的方式工作。也就是说,它不是一个 PHP 进程,不能让它为您运行代码。

它的设计目的是从指定的目录中提供 PHP 应用程序和内容。服务器进程的输出是 访问日志。您可以使用 error_log 函数将消息写入日志,将 message_type 设置为 4。因此,理论上,您可以做一些像这样的事情:

ob_start();
var_dump($_POST);
error_log(ob_get_clean(), 4);

看起来你正在进行一些调试。你应该使用真正的调试工具,而不是拼凑一些东西。


6
我同意你的观点,没有什么可以取代真正的调试,但在开发设置中将日志写入控制台而不是文件听起来也很有趣。 - KingCrunch

9

PHP内置服务器将输出写入php://stdout流,这意味着您可以向其输出任何内容,但这仅适用于调试。

下面是一个快速示例,演示如何将内容写入服务器控制台:

<?php declare(strict_types=1);


/**
 * This is for development purpose ONLY !
 */
final class ServerLogger {

    /**
     * send a log message to the STDOUT stream.
     *
     * @param array<int, mixed> $args
     *
     * @return void
     */
    public static function log(...$args): void {
        foreach ($args as $arg) {
            if (is_object($arg) || is_array($arg) || is_resource($arg)) {
                $output = print_r($arg, true);
            } else {
                $output = (string) $arg;
            }

            fwrite(STDOUT, $output . "\n");
         }
    }
}

// usage example : 
ServerLogger::log('Hello, world!');
// outputting an array : 
ServerLogger::log($_SERVER);

2
这正是我所寻找的! - AlvaroAV
2
这个函数抛出了“ErrorException (E_WARNING)”错误:“使用未定义的常量STDOUT - 假定为'STDOUT'(这将在PHP 7.4的未来版本中引发错误)”。 - Fnr

1
<?php
// PHP 7.4 and up

define('STDOUT', fopen('php://stdout', 'w'));
fwrite(STDOUT, print_r($_REQUEST, true));


5
为了让您的答案更有价值,请考虑添加一些适当的解释。[来自审核] - B001ᛦ

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