17
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPのCLIスクリプトでプログレスバー

Last updated at Posted at 2015-08-17

PHPで長い時間のかかる処理(例えばデータベース間を何らかの変換をかませてデータ移行するバッチスクリプトなど)で途中経過の表示とかをしないとずっと走ってる間はダンマリなので本当にやってるのかどうか不安になる性分

かといって、var_dump()なりprint_r()は出力が冗長すぎ、節目節目にprint/echoするのもその節目間の処理が長い場合は結局不安なのは同じで、fluentdなり他のログサーバに吐き出すのもなあ・・・というときにyumとかのようにプログレスバーを出すのはどうでしょう?というお話

エスケープシーケンスを使ったりすれば自力でできないことはないんだろうけど、PHP-CLI-Progress-Barというものをありがたく使わせてもらう

例としてmysqlからデータを拾ってきて何かしらごにょごにょします、というスクリプトを(漢らしくmysqli直で使うあたりがいかにも使い捨てスクリプトっぽい) ~~

composer.json
{
    "guiguiboy/php-cli-progress-bar": "dev-master"
}
foobar.php
date_default_timezone_set('Asia/Tokyo');

require_once 'vendor/autoload.php';

$mysqli = new mysqli('localhost', '<<username>>', '<<password>>', '<<database>>');
$mysqli->set_charset('utf8');

$records = $mysqli->query('SELECT * FROM tableName');

$n = mysqli_num_rows($records);
$progressBar = new \ProgressBar\Manager(0, $n); // 0からnまでを扱うプログレスバーを作成
while ($record = $records->fetch_assoc()){
    /**
    *   ここで何か面倒な処理をしている
    */
    $progressBar->advance();    // バーの内部カウンタを1つ進める
}
$records->close();
$mysqli->close();

すると、デフォルトではこんな感じの出力に

20/20 [==================================================>] 100.00% 00:00:00

フォーマットは

処理済/全体 プログレスバー パーセンテージ 残り時間

の順番.
ドキュメントを読めば出力フォーマットを色々カスタマイズできるのでお好みで

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?