例えば、大量のデータをデータベースに移行したり、バッチスクリプトでPHPを動かすといったサーバーで重い処理をするとき、バックエンドでPHPを動かして時間のかかる処理をするときがあります。
長時間待っていると、処理が進んでいるかわからなくなりますが、CLI(コマンドライン)で処理をリクエストしてから完了するまでの間、”20%…完了”といった具合に画面上で経過がわかると「処理が進んでいる」と把握することができます。このようなローディングバーを表示させるには自力でプログラムに仕掛けを作る必要があります。
# php -f hogehoge.php
100/100
[================================================>]
100.00% 00:00:00
#
100/100
[================================================>]
100.00% 00:00:00
#
そこで今回は、CLIで重い処理をするときにリアルタイムで処理経過を表示する方法をご紹介します。
尚、今回のローディングバーの実装はPHPライブラリの「PHP-CLI-Progress-Bar」を使います。
また、PHP5.3以上の環境で動かすことを想定しています。
CLIとは?
コマンドラインインタフェース (Command line interface) の略称。 MS-DOSやUnix系あるいはGNU/Linuxシステムにおいて、主にサーバー用途で使用する場合などでは主流となる。 基本的には文字のみのインターフェースで、コマンドを入れて操作する形式となる。
動作環境
- OS : Linux(CentOS 6)
- バージョン : PHP > = 5.3
- ライブラリ
PHP-CLI-Progress-Bar
https://github.com/guiguiboy/PHP-CLI-Progress-Bar
設置方法とサンプルコード
ライブラリをサーバ―にアップロードし、PHPプログラムにインクルードします。以下は、ファイル構成です。
|var |
|—-sample |
|———–| ProgressBar ← ライブラリ
|———–| batch.php ← Sample-1
|———–| shellBase.sh< ← Sample-2
|———–| readList.txt ← Sample-2用テキストファイル
|—-sample |
|———–| ProgressBar ← ライブラリ
|———–| batch.php ← Sample-1
|———–| shellBase.sh< ← Sample-2
|———–| readList.txt ← Sample-2用テキストファイル
Sample-1 コマンドラインでPHPを動かす
batch.phpに引数をつけて処理を実行します。
# php batch.php 100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php #batch.php require_once 'ProgressBar/Manager.php'; require_once 'ProgressBar/Registry.php'; $max = $argv[1]; #引数は$argvに格納されます。 $progressBar = new \ProgressBar\Manager(0, $max); for ($i = 0; $i <= $max ; $i++) { $progressBar->update($i); usleep(100000); } ?> |
Sample-2 シェルからコマンドラインを実行する
# ./shellBase.sh
1 2 3 4 5 6 |
#!/bin/sh FILENAME="/var/progressbar/readList.txt" MAXCOUNT=`cat $FILENAME | wc -l ` php shellBatch.php "${MAXCOUNT}" exit |
シェルでreadList.txtの行数を抽出し、最大数を変数に格納します。その変数をshellBatch.phpの引数として処理をしています。
↓readList.txt
hogehoge01
~ 省略 ~
hogehoge100
~ 省略 ~
hogehoge100
Sample-1、2の実行すると、ループ処理の経過をローディングバーで確認することが出来ます。
100/100
[================================================>]
100.00% 00:00:00
[================================================>]
100.00% 00:00:00