6

我正在编写一个命令行 php 脚本,它对控制台窗口进行一些输出,它看起来都很好,唯一的问题是当我输入

php myfilename.php -....

在控制台窗口中,只有在完全执行后,它才会将结果输出到窗口..

我想要的是像下面这样即时执行此操作

customer id: 1223 skipped.
customer id: 22233 added..

...ETC

另一个问题是将 \n\r 添加到 printf 函数中没有换行...

关于这些问题的任何想法..

4

3 回答 3

6

这可能是由于输出缓冲。您可以ob_flush()在需要时手动刷新缓冲区。

至于您的第二个问题,Microsoft Windows 上换行符的正确顺序是"\r\n",而不是相反。

于 2012-04-23T00:40:42.187 回答
5

首先,Windows 样式的行尾标记是\r\n,而不是\n\r。使用过的系统并不多\n\r,但它们非常罕见,以至于您现在可以忘记它们。

其次,输出被块缓冲的可能性很大——您可以使用在每个输出命令之后ob_implicit_flush(1)自动插入flush()命令。或者,您可以flush()在需要刷新输出时手动调用。

于 2012-04-23T00:44:04.643 回答
3

关于行尾标记,始终使用 PHP 预定义常量 PHP_EOL它是根据您的平台正确设置的,因此您不必担心它是对还是错。

对于 [Enter] 问题,可能是输出缓冲已打开。在您的脚本中添加这个简单的测试:

function test()
{
    $state = array(' added', ' skipped');
    for ($i = 0; $i < 50; $i++)
    {
        echo 'customer id: ' . rand(1, 1000) . $state[rand(0, 1)] . PHP_EOL;
        usleep(50000); // slow it a bit to see the line by line output
    }
}

// without ob -------------------------------------------

$start = microtime(true);
test();
echo 'Finished in ' . round(microtime(true) - $start, 2) . PHP_EOL . str_repeat('-', 78) . PHP_EOL;
sleep(1);

// with ob ----------------------------------------------

$start = microtime(true);
ob_start(); // if called somewhere at the top in your script

// some previous code...
echo 'Line 1'.PHP_EOL.'Line 2'.PHP_EOL.uniqid().PHP_EOL;

// flush the buffer and stop ob
// this will echo whatever is in the output buffer!
//ob_end_flush();

// or, store the current buffer content in a variable and use it later
$output = ob_get_clean();

test();
echo $output;
echo 'Finished in ' . round(microtime(true) - $start, 2) . PHP_EOL . str_repeat('-', 78) . PHP_EOL;

// you could start buffering again, if needed
ob_start();

有关输出控制功能,请参见http://www.php.net/manual/en/ref.outcontrol.php。它们是非常强大的工具。

希望能帮助到你。干杯!

于 2012-05-06T07:40:27.587 回答