Laravel:JOBが同期処理は動くのに非同期処理にすると動かない

Laravel:JOBが同期処理は動くのに非同期処理にすると動かない

動作の遅いプログラムを非同期処理にすべくJOBを書いている今日この頃。
これはそんな状況の中であった事案です。

今回の原因は【$_SERVER['DOCUMENT_ROOT']】

この挙動は状況で変わるようです。これを探し当てるまでかなりかかってしまいました。

Job::dispatch()->onConnection('sync');だとちゃんと動く

悩みどころの切っ掛けはココでした。

#動作する
Job::dispatch()->onConnection('sync');

#動かない
Job::dispatch()->onConnection('database');

既に作成している他のJOBは動く。
と言う事は、データーベースの設定が間違えているわけではない。

なのに同期処理なら動くのに、非同期処理にすると動かない。
なぜ??となった訳です。

まずは動作がどこまで動いているかLOGに記載してみる

use Illuminate\Support\Facades\Log;

~~中略~~

Log::info('ログ_1');

~~中略~~

Log::info('ログ_2');

処理の至る所でログに吐き出させます。

その結果、以下の状況が確認できました。

  1. JOB最後のログを出力している
  2. 途中のIF文がelseの方で動いている
  3. エラーは吐き出していない

と言う事は、プログラムは正常に処理されて何もしない結果を残したと言う事です。

試しに同期処理に戻し同じ処理をしてみます。

  1. JOB最後のログを出力する
  2. 途中のIF文がtrueの方で動いている
  3. ちゃんと想定通りの値を返す
  4. エラーは吐き出していない

先に答えを書いてしまいましたが、今回の原因は【$_SERVER['DOCUMENT_ROOT']】でした。

非同期処理の時、$_SERVER['DOCUMENT_ROOT']は空白になる

ドキュメントルートを取り出すときにこんな書き方すると思います。
Laravelの中で書いていれば何の問題もなくLaravelの保存フォルダまでのパスを取得してきます。

JOBをQUEUEで動かすとこれが空白になり機能しなくなります。

JOBを非同期処理で動かしドキュメントの場所を示すよく使うコードを書いて比較してみました。

#命令
Log::info('1:'.$_SERVER['DOCUMENT_ROOT']);
Log::info('2:'.__DIR__);
Log::info('3:'.dirname(__FILE__));
Log::info('4:'.base_path());

#結果
[2019-09-25 10:33:38] local.INFO: 1:~空白~
[2019-09-25 10:33:38] local.INFO: 2:~Logを書いたファイルがある場所までのパス~  
[2019-09-25 10:33:38] local.INFO: 3:~Logを書いたファイルがある場所までのパス~  
[2019-09-25 10:33:38] local.INFO: 4:~Laravel保存フォルダまでのパス~

非同期条件でも使える $_SERVER['DOCUMENT_ROOT'] と同義のコードは【base_path()】ですね。

まとめ

画像の存在確認でこのプログラムを利用していたのですが、非同期処理に変えたら動かなくなり分かった原因がこれでした。

そりゃねぇ、指示された場所に何もないのだから何も返せませんよね。

いやぁ~疲れたけど勉強になった。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください