さくらインターネットのレンタルサーバーで、Laravelの非同期(バックグラウンド)処理をする

あれ?どうするんだっけ?と本を開いたり、Webを漁ったりと情報集めしていくのがメンドイのでまとめました。ということで、あくまで自分の覚書です!なので説明が多々省かれています!ただ、同じようなニーズをお持ちの方は少なからずいると思うので、適宜参考にしていただければ幸いです。

コトの始め

Laravel初心者のクロコです。オリジナルの画像投稿サイトを作成することになり、悩んだのが画像の保存先。単純に、レンタルサーバーに画像を置けばいいんですけど・・・。無尽蔵に容量があるわけでもなく・・・。そもそも元手もないので、今、契約している以上の容量を契約することもできない。

ということで一計を案じ。投稿される画像自体はレンタルサーバーのストレージとは別のところに保存することにしました。
ただ、その結果、画像自体は2段階でアップロードすることになりました。

User ⇨ Rental Server ⇨ Storage

当然のコトとして、アップロードにかかる時間は倍。画像を投稿する人がかならずWifi環境にいるわけでもないので、通信速度が出てない状態で画像投稿すると数分単位で、レスポンスを待ち続けるというユーザーには耐え難い状態になっていたので。アップロード部分を非同期に出来ないかとチャレンジし始めたのが、コトの始まりでした。

キューを使えば出来る!

Laravelには、非同期で処理をするための仕組みがもちろん用意されていて、キューを利用すればいいってことはわかりました。つまり、画像アップロードの処理を一つのジョブとしてキューに入れ、ワーカーを動かして非同期に画像をアップロードをさせる!

この辺のことを解説してくれてるサイトはココだとか沢山あって、やりたい事ができそうだという事はわかりました。でも実際にやって見ると、試行錯誤の連続!!日本語、英語問わず、ググッても悩んでることへの答えは見つからず、正直、キューを使うのを諦めかけもしました。

という事で前置きが長くなりましたが。「さくらインターネットというレンタルサーバーでLaravelのキューを使うにはこうした」をまとめていきます。

非同期処理できるようにする

先程も書いたように、非同期処理を出来るようにするための準備?は、コチラなどのサイトを参考に対応する。

ちなみに利用しているLaravelのバージョンは8です。DBはMySQL。

準備の流れは
1.JOBテーブル等を準備
2..envファイルの更新
3.非同期処理の実装
4.JOBテーブルにディスパッチ(登録)
5.非同期処理の実行
といった感じです。JOB管理の方法はいくつかありますが、これはDBで管理する場合の方法(他の方法は未経験)

若干、このnoteの趣旨に反するけど、手順は参考サイトをググって実装を・・・。

※ついつい忘れがちなポイント!
ワーカーを動かしている間は、非同期処理に関わるコード変更は反映されない!⇨コード変更した場合は、一度止めるか再起動すること!

サーバー上で動かすには。。。

ローカルでは、シェルでワーカーを動かしておけば、非同期処理を走らせる度に、JOBテーブルから順次処理されていくのは確認できた。
じゃぁ、レンタルサーバー上では???
もちろん、シェルを動かし続けるなんて出来ない・・・。

ググったところコチラの情報にめぐり合う。
要するに、cronで定期的にワーカーを動かしてJOBを処理させてしまえということでした。

なんだ簡単じゃん!ってことでコチラの情報を参考に、タスクスケジュールとcron設定をして・・・待つこと5分(さくらインターネットでは、cronは最短5分でしか回せない)。JOBは・・・・処理されてない!

「え。なんで?」

これがドツボにはまった瞬間でした。
SSHでワーカーを動かすと、JOBは問題なく処理されていたことがより深みにハマるきっかけとなり、コチラの元ネタになったQAを読み込んだり、ググったりと、見当違いの情報を追い求めていたことで、結局2日間悩みました。。。。

改めてcronで吐き出されてるエラーを見たところ、ソケットエクステンションがないよと出てることに気づいたところで「!」の瞬間はやってきました。

「!」の内容
シェルの場合は、エイリアスでソケットエクステンションを有効に出来ているから大丈夫なのに対し、cronではエイリアスが効かない!

ということで、タスクスケジュールに記載しているコマンドを以下のように修正したところ、無事、非同期処理が実行できるようになりました。

誤) $schedule->exec('php artisan queue:work')->everyMinute();
              ⇓
正) $schedule->exec('php -c /home/○○○/php.ini artisan queue:work')->everyMinute();

-cオプションで、php.iniを指定してキューを実行してやる。

以上、さくらインターネットのレンタルサーバーでLaravelの非同期処理を実行するをめぐる悲喜こもごもでした。

いいなと思ったら応援しよう!