【问题标题】:Seeking STDOUT in PHP在 PHP 中寻找 STDOUT
【发布时间】:2010-03-05 14:59:07
【问题描述】:

我有一个在 CLI 中运行的 php 脚本,我想显示当前的百分比进度,所以我想知道是否可以更新 STDOUT 以显示新的百分比。

当我使用 rewind() 或 fseek() 时,它只会抛出一条错误消息。

【问题讨论】:

  • 以下答案非常好,但我想提出另一种方法:保持简单。只需定期输出一行新的进度数据。或打印一个“。”字符。它不像一遍又一遍地更新同一行代码那么酷,但它简单、实用、兼容,并且无论您的应用程序输出到控制台还是通过管道传输到文件,它都可以正常工作。

标签: php stdout command-line-interface


【解决方案1】:

查看此代码:

<?php
echo "1";
echo chr(8);
echo "2";

输出只有 2,因为 "chr(8)" 是 "backspace" 的字符。

所以只需打印您需要返回的字符数量并打印新的百分比。

在 Linux 和 Windows 上打印“\r”也可以,但在 mac 上就不行了

工作示例:

echo "Done: ";
$string = "";
for($i = 0; $i < 100; ++$i) {
    echo str_repeat(chr(8), strlen($string));
    $string = $i."%";
    echo $string;
    sleep(1);
}

【讨论】:

  • 干杯,这个答案很完美:)
  • 它可能适用于某些 7/8 位终端仿真,但它是一个混乱的解决方案
  • 一个“混乱”的解决方案,适用于每个 Linux(bash、shell、..)Windows 和 Mac 平台,并且不需要您构建 ncurses(一个额外的 php 模块,可能在你的主人)或其他东西。在至少 95% 的用例中,除此之外的一切都将浪费 OP 的时间。
【解决方案2】:

输出\r,然后刷新回到当前行的第一列。

【讨论】:

  • 或者,您可以尝试将 ncurses 用于命令行输出,该输出具有 ncurses_move(,) 函数,可让您将输出随意放置在任何位置。
【解决方案3】:

如果您想在输出栅格中向后移动或执行添加颜色之类的操作,那么写入控制台/终端会非常复杂 - 并且行为会因您使用的控制台/终端类型而异。很久以前,有些人提出了构建终端的抽象表示并写入该终端的想法。

有关如何在 PHP 中执行此操作的详细信息,请参阅 this article

【讨论】:

  • @cazlab:“CLI”不是终端类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多