mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-01 11:39:41 +08:00
merge from yiisoft/yii2
This commit is contained in:
@ -2,28 +2,29 @@
|
||||
============================
|
||||
|
||||
あなたのウェブ・アプリケーションのパフォーマンスに影響を及ぼす要因は数多くあります。
|
||||
環境の要因もありますし、あなたのコードに関係する要因もあります。
|
||||
また、Yii そのものに関係する要因もあります。
|
||||
環境の要因もありますし、あなたのコードに関係する要因もあります。また、Yii そのものに関係する要因もあります。
|
||||
このセクションでは要因のほとんどを列挙して、どのようにそれらを修正すればあなたのアプリケーションのパフォーマンスを向上させることが出来るかを説明します。
|
||||
|
||||
|
||||
## PHP 環境を最適化する <span id="optimizing-php"></span>
|
||||
|
||||
PHP 環境を正しく構成することは非常に重要です。
|
||||
最大のパフォーマンスを得るためには、
|
||||
PHP 環境を正しく構成することは非常に重要です。最大のパフォーマンスを得るためには、
|
||||
|
||||
- 最新の安定した PHP バージョンを使うこと。
|
||||
使用する PHP のメジャー・リリースを上げると、顕著なパフォーマンスの改善がもたらされることがあります。
|
||||
- [Opcache](http://php.net/opcache) (PHP 5.5 以降) または [APC](http://php.net/apc) (PHP 5.4) を使って、バイト・コード・キャッシュを有効にすること。
|
||||
- 最新の安定した PHP バージョンを使うこと。使用する PHP のメジャー・リリースを上げると、顕著なパフォーマンスの改善がもたらされることがあります。
|
||||
- [Opcache](http://php.net/opcache) (PHP 5.5 以降) または [APC](http://php.net/apc) (PHP 5.4) を使って、
|
||||
バイト・コード・キャッシュを有効にすること。
|
||||
バイト・コード・キャッシュによって、リクエストが入ってくるたびに PHP スクリプトを解析してインクルードする時間の浪費を避けることが出来ます。
|
||||
- [`realpath()` キャッシュをチューニングする](https://github.com/samdark/realpath_cache_tuner).
|
||||
|
||||
|
||||
## デバッグ・モードを無効にする <span id="disable-debug"></span>
|
||||
|
||||
本番環境でアプリケーションを実行するときには、デバッグ・モードを無効にしなければなりません。
|
||||
Yii は、`YII_DEBUG` という名前の定数の値を使って、デバッグ・モードを有効にすべきか否かを示します。
|
||||
デバッグ・モードが有効になっているときは、Yii はデバッグ情報の生成と記録のために時間を余計に費やします。
|
||||
|
||||
[エントリ・スクリプト](structure-entry-scripts.md) の冒頭に次のコード行を置くことによってデバッグ・モードを無効にすることが出来ます。
|
||||
[エントリ・スクリプト](structure-entry-scripts.md) の冒頭に次のコード行を置くことによってデ
|
||||
バッグ・モードを無効にすることが出来ます。
|
||||
|
||||
```php
|
||||
defined('YII_DEBUG') or define('YII_DEBUG', false);
|
||||
@ -32,6 +33,7 @@ defined('YII_DEBUG') or define('YII_DEBUG', false);
|
||||
> Info: `YII_DEBUG` のデフォルト値は `false` です。
|
||||
従って、アプリケーション・コードの他のどこかでこのデフォルト値を変更していないと確信できるなら、単に上記の行を削除してデバッグ・モードを無効にしても構いません。
|
||||
|
||||
|
||||
## キャッシュのテクニックを使う <span id="using-caching"></span>
|
||||
|
||||
さまざまなキャッシュのテクニックを使うと、あなたのアプリケーションのパフォーマンスを目に見えて改善することが出来ます。
|
||||
@ -39,14 +41,17 @@ defined('YII_DEBUG') or define('YII_DEBUG', false);
|
||||
そうすれば、リクエストごとに毎回同じ Markdown テキストの解析を繰り返すことを回避できるでしょう。
|
||||
Yii によって提供されているキャッシュのサポートについて学ぶためには [キャッシュ](caching-overview.md) のセクションを参照してください。
|
||||
|
||||
|
||||
## スキーマ・キャッシュを有効にする <span id="enable-schema-caching"></span>
|
||||
|
||||
スキーマ・キャッシュは、[アクティブレコード](db-active-record.md) を使おうとする場合には、いつでも有効にすべき特別なキャッシュ機能です。
|
||||
ご存じのように、アクティブレコードは、賢いことに、あなたがわざわざ記述しなくても、DB テーブルに関するスキーマ情報 (カラムの名前、カラムのタイプ、外部キー制約など) を自動的に検出します。
|
||||
アクティブレコードはこの情報を取得するために追加の SQL クエリを実行しています。
|
||||
スキーマ・キャッシュは、[アクティブ・レコード](db-active-record.md) を使おうとする場合には、いつでも有効にすべき特別なキャッシュ機能です。
|
||||
ご存じのように、アクティブ・レコードは、賢いことに、あなたがわざわざ記述しなくても、
|
||||
DB テーブルに関するスキーマ情報 (カラムの名前、カラムのタイプ、外部キー制約など) を自動的に検出します。
|
||||
アクティブ・レコードはこの情報を取得するために追加の SQL クエリを実行しています。
|
||||
スキーマ・キャッシュを有効にすると、取得されたスキーマ情報はキャッシュに保存されて将来のクエリで再利用されるようになります。
|
||||
|
||||
スキーマ・キャッシュを有効にするためには、[アプリケーションの構成情報](concept-configurations.md) の中で、`cache` [アプリケーション・コンポーネント](structure-application-components.md) にスキーマ情報を保存するように構成し、[[yii\db\Connection::enableSchemaCache]] を `true` に設定します。
|
||||
スキーマ・キャッシュを有効にするためには、[アプリケーションの構成情報](concept-configurations.md) の中で、
|
||||
`cache` [アプリケーション・コンポーネント](structure-application-components.md) にスキーマ情報を保存するように構成し、[[yii\db\Connection::enableSchemaCache]] を `true` に設定します。
|
||||
|
||||
```php
|
||||
return [
|
||||
@ -73,6 +78,7 @@ return [
|
||||
];
|
||||
```
|
||||
|
||||
|
||||
## アセットを結合して最小化する <span id="optimizing-assets"></span>
|
||||
|
||||
複雑なウェブ・ページでは、多数の CSS や JavaScript のアセット・ファイルをインクルードすることがよくあります。
|
||||
@ -80,6 +86,7 @@ HTTP リクエストの回数、および、これらのアセットの全体と
|
||||
これによって、ページのロードにかかる時間とサーバの負荷を大きく削減することが出来ます。
|
||||
詳細については、[アセット](structure-assets.md) のセクションを参照してください。
|
||||
|
||||
|
||||
## セッションのストレージを最適化する <span id="optimizing-session"></span>
|
||||
|
||||
デフォルトでは、セッションのデータはファイルに保存されます。
|
||||
@ -101,8 +108,7 @@ return [
|
||||
// 以下を設定する
|
||||
// 'db' => 'mydb',
|
||||
|
||||
// デフォルトの session テーブルをオーバーライドするためには
|
||||
// 以下を設定する
|
||||
// デフォルトの session テーブルをオーバーライドするためには以下を設定する
|
||||
// 'sessionTable' => 'my_session',
|
||||
],
|
||||
],
|
||||
@ -126,26 +132,32 @@ CREATE TABLE session (
|
||||
ただし、キャッシュ・ストレージの中には、容量の上限に達したときにキャッシュされたデータをフラッシュするものがあることに注意してください。
|
||||
この理由により、主として容量の上限が無い種類のキャッシュ・ストレージを使用すべきです。
|
||||
|
||||
あなたのサーバに [Redis](http://redis.io/) がある場合は、[[yii\redis\Session]] によって redis をセッション・ストレージとして使用することを強く推奨します。
|
||||
あなたのサーバに [Redis](http://redis.io/) がある場合は、[[yii\redis\Session]] によって redis
|
||||
をセッション・ストレージとして使用することを強く推奨します。
|
||||
|
||||
|
||||
## データベースを最適化する <span id="optimizing-databases"></span>
|
||||
|
||||
DB クエリの実行とデータベースからのデータ取得がウェブ・アプリケーションのパフォーマンスの主たるボトルネックになることがよくあります。
|
||||
[データ・キャッシュ](caching-data.md) の使用によってパフォーマンスの劣化を緩和することは出来ますが、問題を完全に解決することは出来ません。
|
||||
データベースが膨大なデータを抱えている場合、キャッシュされたデータが無効化されたときに最新のデータを取得するためのコストは、データベースとクエリが適切に設計されていないと、法外なものになり得ます。
|
||||
データベースが膨大なデータを抱えている場合、キャッシュされたデータが無効化されたときに最新のデータを取得するためのコストは、
|
||||
データベースとクエリが適切に設計されていないと、法外なものになり得ます。
|
||||
|
||||
DB クエリのパフォーマンスを向上させるための一般的なテクニックは、フィルタの対象になるテーブル・カラムにインデックスを作成することです。
|
||||
例えば、`username` によってユーザのレコードを検索する必要があるなら、`username` に対してインデックスを作成するべきです。
|
||||
ただし、インデックスを付けると SELECT クエリを非常に速くすることが出来る代りに、INSERT、UPDATE、または DELTE のクエリが遅くなることに注意してください。
|
||||
|
||||
複雑な DB クエリについては、クエリの解析と準備の時間を節約するために、データベース・ビューを作成することが推奨されます。
|
||||
|
||||
最後にもう一つ大事なことですが、SELECT クエリで LIMIT を使ってください。
|
||||
こうすることで、大量のデータが返されて、PHP のために確保されたメモリを使い尽くすということがなくなります。
|
||||
|
||||
|
||||
## プレーンな配列を使う <span id="using-arrays"></span>
|
||||
|
||||
[アクティブレコード](db-active-record.md) は非常に使い勝手のよいものですが、データベースから大量のデータを取得する必要がある場合は、プレーンな配列を使うほどには効率的ではありません。
|
||||
そういう場合は、アクティブレコードを使ってデータを取得する際に `asArray()` を呼んで、取得したデータがかさばるアクティブレコードのオブジェクトではなく配列として表現されるようにすることを考慮するのが良いでしょう。
|
||||
[アクティブ・レコード](db-active-record.md) は非常に使い勝手のよいものですが、データベースから大量のデータを取得する必要がある場合は、プレーンな配列を使うほどには効率的ではありません。
|
||||
そういう場合は、アクティブ・レコードを使ってデータを取得する際に `asArray()` を呼んで、
|
||||
取得したデータがかさばるアクティブ・レコードのオブジェクトではなく配列として表現されるようにすることを考慮するのが良いでしょう。
|
||||
例えば、
|
||||
|
||||
```php
|
||||
@ -160,8 +172,7 @@ class PostController extends Controller
|
||||
}
|
||||
```
|
||||
|
||||
上記において、`$posts` は、テーブル行の配列としてデータを代入されることになります。
|
||||
各行はプレーンな配列になります。
|
||||
上記において、`$posts` は、テーブル行の配列としてデータを代入されることになります。各行はプレーンな配列になります。
|
||||
`$i` 番目の行の `title` カラムにアクセスするためには、`$posts[$i]['title']` という式を使うことが出来ます。
|
||||
|
||||
クエリを構築するのに [DAO](db-dao.md) を使って、データをプレーンな配列に取得することも出来ます。
|
||||
@ -169,7 +180,8 @@ class PostController extends Controller
|
||||
|
||||
## Composer オートローダを最適化する <span id="optimizing-autoloader"></span>
|
||||
|
||||
Composer のオートローダは、ほとんどのサードパーティのクラス・ファイルをインクルードするのに使われますので、次のコマンドを実行して Composer のオートローダを最適化することを考慮すべきです。
|
||||
Composer のオートローダは、ほとんどのサードパーティのクラス・ファイルをインクルードするのに使われますので、
|
||||
次のコマンドを実行して Composer のオートローダを最適化することを考慮すべきです。
|
||||
|
||||
```
|
||||
composer dumpautoload -o
|
||||
@ -183,10 +195,10 @@ composer dumpautoload -o
|
||||
|
||||
## オフラインでデータを処理する <span id="processing-data-offline"></span>
|
||||
|
||||
リクエストが何らかのリソース集約的な操作を必要とするものである場合は、そういう操作が終るまでユーザを待たせずに、オフラインモードで操作を実行する方策を考えるべきです。
|
||||
リクエストが何らかのリソース集約的な操作を必要とするものである場合は、そういう操作が終るまでユーザを待たせずに、
|
||||
オフラインモードで操作を実行する方策を考えるべきです。
|
||||
|
||||
オフラインでデータを処理するための方法が二つあります。
|
||||
すなわち、プルとプッシュです。
|
||||
オフラインでデータを処理するための方法が二つあります。すなわち、プルとプッシュです。
|
||||
|
||||
プルの方法では、リクエストが何らかの複雑な操作を必要とするたびに、タスクを作成してデータベースなどの持続的ストレージに保存します。
|
||||
そうしておいて、別の独立したプロセス (例えばクロンジョブ) を使い、タスクを引き出して処理します。
|
||||
@ -203,7 +215,7 @@ composer dumpautoload -o
|
||||
あなたは、あなたのコードをプロファイルして、パフォーマンスのボトルネックを発見し、それに応じた適切な手段を講じるべきです。
|
||||
次のプロファイリング・ツールが役に立つでしょう。
|
||||
|
||||
- [Yii のデバッグ・ツール・バーとデバッガ](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md)
|
||||
- [Yii のデバッグ・ツールバーとデバッガ](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md)
|
||||
- [Blackfire](https://blackfire.io/)
|
||||
- [XHProf](http://www.php.net/manual/ja/book.xhprof.php)
|
||||
- [XDebug プロファイラ](http://xdebug.org/docs/profiler)
|
||||
|
||||
Reference in New Issue
Block a user