<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>パフォーマンス on ララジャパン</title>
        <link>https://www.larajapan.com/tags/%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9/</link>
        <description>Recent content in パフォーマンス on ララジャパン</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Tue, 13 Sep 2016 01:59:13 +0900</lastBuildDate><atom:link href="https://www.larajapan.com/tags/%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>ちょっとしたパフォーマンスの改善</title>
        <link>https://www.larajapan.com/2016/09/13/%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E6%94%B9%E5%96%84/</link>
        <pubDate>Tue, 13 Sep 2016 01:59:13 +0900</pubDate>
        
        <guid>https://www.larajapan.com/2016/09/13/%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E6%94%B9%E5%96%84/</guid>
        <description>&lt;p&gt;Laravelは非常にたくさんのファイルを起動時に読み込んでいるので、パフォーマンスの改善は以前から感心があります。最近、管理画面だけでrouteの数が300近いプログラムをインストールするにあたり、重たくなることを予想して、簡単にできる範囲でLaravelでのパフォーマンスの改善を調査してみました。&lt;/p&gt;
&lt;h2&gt;１．設定ファイルのキャッシュ作成&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;artisan&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この実行は、&lt;coce&gt;config&lt;/code&gt;のディレクトリにあるファイルすべてを合わせて１つのキャッシュファイルにします。これにより設定データのローディング時間を速めようということです。&lt;/p&gt;
&lt;p&gt;ファイルは、&lt;/p&gt;
&lt;p&gt;bootstrap/cache/config.php&lt;/p&gt;
&lt;p&gt;として作成されます。&lt;/p&gt;
&lt;p&gt;この使用において、注意は３点あります。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;注意点１:プログラムにおいて&lt;code&gt;env()&lt;/code&gt;の関数を使用してはいけない&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;例えば、&lt;/p&gt;
&lt;p&gt;.envのファイルにおいて、&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;APP_ENV&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と設定していて、&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;APP_ENV&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/logs/test.log&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように、現在の環境変数の値によりログファイルを置くディレクトリを変えるとすると、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$path&lt;/code&gt;の値は、&lt;/p&gt;
&lt;p&gt;/var/www/test/storage/local/logs/test.log&lt;/p&gt;
&lt;p&gt;のようになります。&lt;/p&gt;
&lt;p&gt;しかし、&lt;code&gt;php artisan config:cache&lt;/code&gt;を実行すると、&lt;code&gt;env()&lt;/code&gt;の値は空となり、&lt;/p&gt;
&lt;p&gt;/var/www/test/storage/logs/test.log&lt;/p&gt;
&lt;p&gt;となってしまい、意図した場所とは違うことになってしまいます。&lt;/p&gt;
&lt;p&gt;それゆえに、先のプログラムは以下と変更することが必要です。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;app.env&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/logs/test.log&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もちろん、&lt;code&gt;config/app.php&lt;/code&gt;などの設定ファイルの中での&lt;code&gt;env()&lt;/code&gt;の使用は問題ないです。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;注意点２:ダイナミックに値を設定しているconfigに気をつける&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;設定ファイルの値は、&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;some_setting&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;some_value&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにダイナミックに値の設定が可能です。例えば、DBからの値を&lt;code&gt;AppServiceProvider::boot()&lt;/code&gt;で読み込んでおいて、DBに再度アクセスすることなくプログラムのあちらこちらで使用しようというときなどに便利です。&lt;/p&gt;
&lt;p&gt;ところが、&lt;code&gt;php artisan config:cache&lt;/code&gt;の実行時に、&lt;code&gt;AppServiceProvider::boot()&lt;/code&gt;が実行されるので、それらの設定もキャッシュファイルに保存されてしまいます。これで、ダイナミックに変わる値が固定されては困ります。&lt;/p&gt;
&lt;p&gt;しかし、ダイナミックに上書きされるので問題はなさそうです。しかし、プログラムの他の部分では問題があるかもしれません。使用には気をつけてください。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;注意点３：.envやconfigのファイルを編集したら、必ずキャッシュを再作成&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;最後に忘れてはならないのは、&lt;code&gt;.env&lt;/code&gt;や&lt;code&gt;config/*.php&lt;/code&gt;のファイルを編集したら、必ず&lt;code&gt;php artisan config:cache&lt;/code&gt;の実行が必要なことです。それなくしては、せっかくの変更も反映されません。&lt;/p&gt;
&lt;h2&gt;２．routeのキャッシュ作成&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;artisan&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こちらは、&lt;code&gt;config:cache&lt;/code&gt;と違い、この実行で作成されるファイル、&lt;/p&gt;
&lt;p&gt;bootstrap/cache/routes.php&lt;/p&gt;
&lt;p&gt;には、&lt;code&gt;routes.php&lt;/code&gt;ファイルを読み込んでLaravelがマップしたデータ構造を&lt;code&gt;base64_encode&lt;/code&gt;して、&lt;code&gt;serialize&lt;/code&gt;した形で収めます。それゆえに、この読み込みとマップの作業を一気に短縮します。とくに、routeの数が大きいプロジェクトではパフォーマンスの改善に期待できる仕組みです。&lt;/p&gt;
&lt;p&gt;それからconfig:cacheと同様に、routes.phpファイルを編集したら、必ず&lt;code&gt;php artisan route:cache&lt;/code&gt;の実行が必要です。&lt;/p&gt;
&lt;h2&gt;３．共有クラスファイルの最適化&lt;/h2&gt;
&lt;p&gt;これは、環境変数の&lt;code&gt;APP_ENV&lt;/code&gt;がproductionの値のときにだけに有効なものです。また、設定ファイルに依存するので、設定ファイルをキャッシュするなら、&lt;code&gt;php artisan config:cache&lt;/code&gt;を実行してから以下を実行してください。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;artisan&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;optimize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この実行で、共有されるクラスファイルを１つのファイルにまとめ、読み込み時間を短縮するのが目的です。以下のファイルを作成します。&lt;/p&gt;
&lt;p&gt;bootstrap/cache/compiled.php&lt;/p&gt;
&lt;p&gt;このファイルには、デフォルトでは、Laravel関連のファイルが含まれますが、必要なら以下の設定ファイルに追加が可能です。&lt;/p&gt;
&lt;p&gt;bootstrap/cache/compile.php&lt;/p&gt;
&lt;h2&gt;改善した？&lt;/h2&gt;
&lt;p&gt;さて、実際にこれらの最適化でパフォーマンスはどれくらい変わるのでしょうか？&lt;/p&gt;
&lt;p&gt;私の厳密ではないテストでは、DB操作を伴わない計測では１０～３０％の違いがありました。configよりもrouteやoptimizeの方が実際のパフォーマンスにより影響ありました。多分、設定ファイルが小さく数少ないためがその違いと思います。しかし、現実では、DBクエリーやCSS、JS、画像などのダウンロードがはるかに時間がかかるので、まだ私のプロジェクトのスケールではちょっとした改善というところです。スケールがより大きくなるとかなりの差となるかもしれません。&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
