Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Command line Php命令行动态输出_Command Line_Php - Fatal编程技术网

Command line Php命令行动态输出

Command line Php命令行动态输出,command-line,php,Command Line,Php,我正在编写一个命令行php脚本,它会向控制台窗口输出一些内容,它看起来都不错,唯一的问题是当我键入 php myfilename.php -.... 在控制台窗口中,只有在其完全执行后,才会将结果输出到窗口 我想做的是像下面这样在飞行中做这件事 customer id: 1223 skipped. customer id: 22233 added.. …等等 另一个问题是向printf函数添加\n\r没有转到新行 对这些问题有什么想法吗?这可能是由于。您可以在需要时使用ob_flush()手

我正在编写一个命令行php脚本,它会向控制台窗口输出一些内容,它看起来都不错,唯一的问题是当我键入

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

我想做的是像下面这样在飞行中做这件事

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

另一个问题是向printf函数添加\n\r没有转到新行

对这些问题有什么想法吗?

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

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

首先,是。使用过
\n\r
的系统不多,但它们非常罕见,您现在可以忘记它们了


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

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

对于[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();
功能测试()
{
$state=array('added','skipped');
对于($i=0;$i<50;$i++)
{
echo“customer id:”.rand(1,1000)。$state[rand(0,1)].PHP_EOL;
usleep(50000);//稍微慢一点以查看逐行输出
}
}
//无产科医生-------------------------------------------
$start=microtime(真);
test();
echo“完成于”。四舍五入(微时(真)-$start,2)。PHP_EOL。stru重复序列('-',78)。PHP_EOL;
睡眠(1);
//有产科医生----------------------------------------------
$start=microtime(真);
ob_start();//如果在脚本顶部的某个位置调用
//以前的一些代码。。。
echo'Line 1'.PHP_EOL'Line 2'.PHP_EOL.uniqid().PHP_EOL;
//刷新缓冲区并停止ob
//这将回显输出缓冲区中的任何内容!
//ob_end_flush();
//或者,将当前缓冲区内容存储在变量中,以后再使用
$output=ob_get_clean();
test();
echo$输出;
echo“完成于”。四舍五入(微时(真)-$start,2)。PHP_EOL。stru重复序列('-',78)。PHP_EOL;
//如果需要,您可以再次开始缓冲
ob_start();
有关输出控制功能,请参阅。它们是非常强大的工具


希望能有帮助。干杯

第一个问题似乎已经解决,即使我使用了“\r\n”,它也不会在控制台中显示新行,但如果我在代码中输入enter,它的效果会很好。。上面的帖子解决了一个问题,我绞尽脑汁了好几天,即使没有直接关系。我以为我有缓冲问题。事实证明,我所需要做的就是在echo语句的末尾添加PHP_EOL,以使stdout进入日志输出。最简单的事情,我浪费了很多时间。