LaravelでHello Worldするだけならば

タグ: Laravel5.1LTS   Laravel  

この記事はLaravel Advent Calendar 2015の2015年12月10日分です。

Laravelは遅い。ええ、他の軽いフレームワークと比べれば遅いでしょう。理由は明白で、予めいろいろと準備済みだからです。

全て同じではありませんが、Laravelのコンポーネント(ライブラリー)を使用している兄弟フレームワークのLumenが早いのは、初期状態ではほとんど何も準備していないからです。

他のフレームワークはこうしたオーバーヘッドを避けるため、Lumenと同様に使用するコンポーネントを明確に設定するようになっているものが多いのです。初期状態では機能的にスカスカです。

「初期起動のオーバーヘッドを計測する」という目的の"hello world"出力によるベンチマークでは、スカスカな状態でもテストできますので、「初めスカスカ、後から追加」方式のフレームワークのほうが断然有利です。

ですから、Laravelもスカスカに近い形にすればかなり早くなります。初期設定のサービスプロバイダーを削ってみるのが手早い方法です。やってみましょう。Laravel5.1です。config/app.phpファイルを先ず編集します。

    'providers' => [
        /*
         * Laravel Framework Service Providers...
         */
        'Illuminate\Routing\ControllerServiceProvider',
        'Illuminate\Cookie\CookieServiceProvider',
        'Illuminate\Encryption\EncryptionServiceProvider',
        'Illuminate\Filesystem\FilesystemServiceProvider',
        'Illuminate\Session\SessionServiceProvider',
        'Illuminate\View\ViewServiceProvider',

        /*
         * Application Service Providers...
         */
        'App\Providers\AppServiceProvider',
        'App\Providers\RouteServiceProvider',
    ],
    'aliases' => [
        'Route'     => 'Illuminate\Support\Facades\Route',
    ],

これでルート定義は最低限にします。app/Http/routes.phpです。

Route::get('/', 'WelcomeController@index');

コントローラーのアクションメソッドから直接文字列を返します。

<?php
 namespace App\Http\Controllers;

class WelcomeController extends Controller {

    public function index()
    {
        return 'hello world';
    }
}

だいぶ前に確認したので、詳細は忘れましたが、半分以下になったように記憶しています。(今は測定している暇がありません。)

コントローラーを使用せず、ルート定義でクロージャーを使用しロジックを定義すれば、完全にスカスカです。

    'providers' => [
        /*
         * Laravel Framework Service Providers...
         */
        'Illuminate\Filesystem\FilesystemServiceProvider',

        /*
         * Application Service Providers...
         */
        'App\Providers\RouteServiceProvider',
    ],
    'aliases' => [
        'Route'     => 'Illuminate\Support\Facades\Route',
    ],

グローバルに動作するミドルウェアも消しておきましょう。app/Http/kernel.phpです。

    protected $middleware = [
    ];

もちろん、Lumenであれ、他のフレームワークであれ、実際に機能を実現していくうえで、フレームワークにそなわっているコンポーネントを有効にしていけばいくほど、オーバーヘッドは増えていきます。ですから、自分が実現しようとしている機能を本番で動作する状況と近いテストプログラムで、測定しなければベンチマークはあまり役に立ちません。

ところで、こんなにスカスカのLaravelに、皆さん魅力を感じますか?