【6倍速】Laravelの爆速化ライブラリ「Laravel Octane」の導入方法と速度検証


アイキャッチ画像

爆速化パッケージ「Laravel Octane」とは

Laravel Octaneとはphp-fpmよりも遥かに高速なミドルウェアを使ったLaravelプロジェクトの爆速化を実現するFirst-Partyライブラリです。昨年にリリースされたばかり。

Go言語で実装された「RoadRunner」とC言語で実装された「Swoole」がミドルウェアとして利用可能で、わずか数コマンドでセットアップできる手軽さも魅力です。

本稿ではCで実装されている「Swoole」を利用したLaravel Octaneの導入方法と速度検証を行います。

UbuntuにさくっとSwoole+Octane導入

# 動作環境
OS      -> Ubuntu 20.04 LTS
Env     -> WSL on Windows10
PHP     -> v8.0.14 (CLI)
Laravel -> v9.2

Openswooleインストール

Octaneを動作させるために、まずはOpenswooleを導入しましょう。
Mac等その他の導入方法は公式ドキュメントを要参照。

PECLでインストールする方法もありますが、apt経由だとphp.ini関連設定を自動でやってくれますのでこちらを使います。
Docker上で導入するならLaravel Sailを介す必要があるため公式ドキュメントを確認して下さい。本稿ではUbuntu上に導入します。
$ sudo su -
# ↑rootで入らないと以下でエラー吐きます
apt install -y software-properties-common && add-apt-repository ppa:openswoole/ppa -y
apt install -y php8.0-openswoole
# 8.1なら「php8.1-openswoole」に!

インストールが終わったらphp -iコマンドで正常にextentionとして読み込まれているか確認して下さい。

$ php -i | grep swoole
/etc/php/8.0/cli/conf.d/30-openswoole.ini
openswoole
Author => Open Swoole Group <[email protected]>
 ︙
 ︙ 以下略

Laravel Octaneインストール

Laravelプロジェクト上でLaravel Octaneを導入します。今回はSwooleを使うので[1]を選択。

$ composer require laravel/octane
$ php artisan octane:install
Which application server you would like to use?:
[0] roadrunner
[1] swoole
> 1

これで設定は完了。

サーバー起動

最後にサーバーを起動してみましょう。オプション等もArtisanコマンドと同じで、–port や –hostも指定可。

$ php artisan octane:start
 INFO  Server running…
Local: http://127.0.0.1:8000
Press Ctrl+C to stop the server

変更を反映させる

先程のoctane:startを起動すると、アプリケーションがメモリロードされるため、変更が反映されなくなります。

開発中の場合は、ホットリロードを有効する必要がありファイルの変更があると自動で更新してくれます。
詳しくはこちら

npm install --save-dev chokidar
php artisan octane:start --watch
 INFO  Application change detected. Restarting workers…

何の設定もせずとも表示時間が6倍短縮

ベンチマークでは高速化した!と言っても実際の所どうなの?という疑問に答えるべく実際にArtisanサーバーとOctaneサーバーでの比較を行ってみました。

Welcomeページの表示

まずはLaravelを導入したら入っているデフォルトのWelcomeページで速度検証してみました。
※記事最後にApache Benchテストもあります

Artisan serve 93.70ms
Octane:start 15.34ms

6.01倍の高速化が結果として得られました。飛躍的な速度向上が見られてとても感動です。

データベース処理を含む場合

OPcache+JIT導入時に測定した際、データベース等の処理がある場合はあまり速度短縮の効果は得られなかったのですがOctaneの場合は以下の通り。

Artisan serve 121.59ms
Octane:start 36.45ms

 

3倍以上時間が短縮されました。
ただ、MongoDBシェルでの処理時間は3msだったため、これはもともとLaravelが重いことも要因の1つではないでしょうか。

Apache Bench(ab)負荷耐久テスト

最後にabテストで負荷をかけて処理時間を競ってみましょう。
今回はWelcomeページに対して1,000回リクエストを投げて完了するまでの時間を測定しました。

1秒間当たりの処理数 所要時間
Artisan serve 52.11回 19.188秒
Octane:start 274.18回 3.647秒
短縮率 5.2615倍

ログはGitHubにて:https://github.com/ichii731/php-examples/blob/main/laravel_octane_test/ab_test.log

ちなみにアクセスした際の応答時間はOctane:startでサーバー起動したらログとして表示されます。

200 GET / ............................................ 18.70 mb 92.61 ms
200 GET / ............................................. 18.83 mb 4.01 ms
200 GET / ............................................. 18.83 mb 3.91 ms

以上Laravel Octaneのセットアップ手順と速度検証のご紹介でした。