JavaScriptを有効にしてください

【PHP】CLIで進捗表示を行うプログレスバーを出力する方法

 ·  ☕ 2 分で読めます

【PHP】CLIで進捗表示を行うプログレスバーを出力する方法

PHP の CLI で進捗表示を行うプログレスバーを出力する方法メモ

キャリッジリターンを使用する

キャリッジリターンは行末から行頭に戻すコードです。

行末から行頭に戻す復帰コード

これをすると以下のようにすると今までの出力の行頭に移動して出力済みの文字を上書きを行う訳です。

1
2
3
4
5
<?php
echo "12345";
echo "\r";
echo "6789";
echo PHP_EOL;

これを実行すると結果は 67895 と表示され 1234 までは上書きを行ってくれるようです。

そういう際はスペースを利用して前出力の値をスペースで上書きを行ってしまいましょう。

1
2
3
4
5
<?php
echo "12345";
echo "\r";
echo "6789 ";
echo PHP_EOL;

バックスペースを利用する

バックスペースを利用することでカーソルを1つ戻すことが出来ます。

これをすると以下のようにすると今までの出力の行頭に移動して出力済みの文字を上書きを行う訳です。

1
2
3
4
echo '987654321';
echo "\r";
echo "1234     \x08\x08\x08\x08\x08";
echo PHP_EOL;

5つのスペースで文字を上書きしてからバックスペース5つでカーソルは 1234 の末尾に来ます。

サンプル

上記でバックスペースを説明させていただきましたが、今回は使用しない方法で良いサンプルがありましたのでそちらの方法を使用します。
コマンドラインでの進捗状況(プログレスバー)を表示する(PHP)

以下を実行すると Processing... | [####################]100% というプログレスバーが出力されます。
これでCLI上でのPHPの実行の進捗具合がわかりやすくなります。

 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
<?php
/**
 * ProgressBar Display Class
 */
class ProgressBar
{
    // Progress Symbols
    private const PROGRESS_SYMBOL = ['|', '/', '-', '\\'];

    /**
     * Progress Output
     *
     * @param integer $progress
     * @return void
     */
    public static function progress(int $progress): void
    {
        echo "\r";
        $block = str_repeat('#', floor($progress / 5));
        printf('Processing...  %s [%-20s]%3d%%', self::PROGRESS_SYMBOL[$progress % count(self::PROGRESS_SYMBOL)], $block, $progress);
        flush();

        if ($progress >= 100) {
            echo PHP_EOL;
        }
    }
}

// 実行する
$total = 100;
$count = 0;
for ($i = 0; $i < $total; $i++) {
    $count = $i + 1;

    // 進捗パーセンテージ計算
    $progress = ($count / $total * 100);
    ProgressBar::progress(round($progress, 0));

    // 表示用に適当なスリープ
    usleep(100000);
}

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer