[0038]ControllerからArtisanとキーワーカーを利用してCronを非同期で実行
■処理
Cronに予め設定する方法ではないので、Kernel.phpへの記述は不要です。
この例の環境は、Lalavelフレームワークのバージョンは10です。
App\Console\Commandsの作成などは飛ばします。Cron実行するものと同様で作成します。既にscQueueListActという名前のCommandがある前提から進めます。
今回はボタンを押したタイミングでCronを非同期で実行したかったので、Viewにボタンを用意します。
XXX.blade.php
@extends('admin.common.layout')
@section('content')
@include('admin.errors.form_errors')
@include('admin.errors.form_errors_jsonly')
@endsection
@section('script')
$('#del').click(function(){
// ダイアログを作成
var strComment = "XXXを実行します。
実行してよろしいですか?";
// ダイアログのメッセージを設定
$( "#show_dialog" ).html( strComment );
$( "#show_dialog" ).dialog({
modal: true,
title: "確認ダイアログ",
buttons: {
"はい": function() {
$( this ).dialog( "close" );
$('#del_f').val(1);
$('#form_s').submit();
},
"いいえ": function() {
$('#del_f').val(0);
$( this ).dialog( "close" );
}
}
});
});
@endsection
ボタン押下時に確認ダイアログを表示し、はいの場合にSubmitを実行します。
実行後、ControllerからCronを非同期で実行します。同期実行したい場合は、「> /dev/null 2>&1 &」を抜けば良いです。useを忘れずに入れてください。
普段Cronを実行するときにcrontabで設定する名前と同じものをArtisan::queueに設定します。今回の例ではscQueueListActです。
execを利用して、一度だけキューワーカーを実行し、プロセスを終了しています。終了したいので「--stop-when-empty」を入れています。
XXXXController.php
<?php
namespace App\Http\Controllers\Admin\Other;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use View;
use Validator;
use Log;
use Artisan;
class XXXXController extends Controller{
public function sc_auto(Request $request)
{
$paraArrs = $request->all();
if(@$paraArrs['del_f'] == 1){
try{
Artisan::queue('scQueueListAct');
exec("cd /var/www/vhost/tsjpro;php artisan queue:work --stop-when-empty > /dev/null 2>&1 &");
\Flash::info('実行を開始しました。処理が終わりましたらメールを送信します。内容はメールにてご確認ください');
} catch (\Exception $e) {
\Flash::error('エラーのため更新できませんでした
'.$e);
}
return redirect()->to('/admin/other/sc_auto');
}
return view('admin.other.person_all_del.sc_auto')->with('paraArrs',$paraArrs);
}
}
非同期実行なので、実行処理はバックグラウンド処理され、画面は\Flash::infoの値が表示されます
ユーザの好きなタイミングで重い処理を実行したいときに利用しています。