担当しているプロジェクトで、Laravelのコマンドラインで実行するバッチ処理がいくつかあるのですが、ユーザー数が日に日に増えていき実行時間が長くなっていきました。
普段は自動で実行しているので特に問題ないのですが、先日テストのため手動でバッチを実行しないといけないことがあり、
(この処理いつ終わるんだろう・・・・)
となってしまいました😖
処理を実行して放置すれば良いとしても、目安もわからず、都度確認するのは大変だと思いますので、今回はコマンド実行の処理とプログレスバーの作成方法をご紹介いたします。
前提条件
■Laravel バージョン
$ php artisan -V
Laravel Framework 8.27.0
1. コマンドを作成する
コマンドを作成します。今回は例として、ランキング作成の処理としました。# php artisan make:command [コマンド名]
$ php artisan make:command CreateRankingCommand
自動で作成されたファイルを確認すると下記のようになっています。
// app/Console/Commands/CreateRankingCommand.php
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class CreateRankingCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
return 0;
}
}
まず、2つの項目を設定します。
1. $signatureに、コマンド名を設定します。ここに設定した名前を使用して、コマンドラインで処理を実行することになります。
2. $description に、このコマンドの説明を記載します。
修正すると、以下のようになりました。
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:create_ranking'; // 修正しました
/**
* The console command description.
*
* @var string
*/
protected $description = 'ランキングを作成します。'; // 修正しました
次に、コマンドが実行できるか確認します。
処理内容はhandle()内に本来記載しますが、初期状態から何も修正していないので、特にエラー等が表示されなければ問題ありません。
# php artisan command:[コマンド名]
$ php artisan command:create_ranking
また、以下のようにコマンドが作成できているか確認することもできます。
$ php artisan list | grep command:
command:create_ranking ランキングを作成します。
2. プログレスバーを作成する
コマンドが実行できることは確認できたので、処理とプログレスバーを作成します。処理内容は、handle()メソッドの中に記載します。
大変簡素ですが、今回はただループするだけの処理を作成します。
public function handle()
{
$count = 10;
for ($i = 1; $i <= $count; $i++) {
// 本来、ここで何か処理を行います
}
return 0;
}
ここにプログレスバーを表示する処理を追記していきます。
コードの説明としては、下記①②③のコメントに記載した通りです。
public function handle()
{
$count = 10;
// ①処理の総ステップ数を指定します
$progressBar = $this->output->createProgressBar($count);
for ($i = 1; $i <= $count; $i++) {
// 本来、ここで何か処理を行います
// ②プログレスバーの表示を1つ分進めます
$progressBar->advance();
}
// ③プログレスバーの表示を完了状態にします
$progressBar->finish();
return 0;
}
処理を実行すると下記のようになります。
※この処理は中身がないため、すぐ終わります。
$ php artisan command:create_ranking
10/10 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
とても簡単に処理の進捗度を表示できるようになりました!
以上となります。
参考にして頂ければ幸いです。
Laravel , PHP
0 件のコメント:
コメントを投稿