Web アプリケーションのパフォーマンスは、多くの要因の影響を受けます。データベース アクセス、ファイル システム操作、ネットワーク帯域幅などはすべて、潜在的な影響要因となります。 Yii は、さまざまな側面でフレームワークのパフォーマンスへの影響を軽減しました。しかし、ユーザー アプリケーションには、パフォーマンスを向上させるために改善できる箇所がまだたくさんあります。
PHP APC 拡張機能を有効にすることは、おそらくアプリケーションの全体的なパフォーマンスを向上させる最も簡単な方法です。この拡張機能は、PHP 中間コードをキャッシュして最適化し、新しいリクエストごとに PHP スクリプトの再解析に費やす時間を回避します。
デバッグ モードを無効にすることも、パフォーマンスを向上させる簡単な方法です。定数 YII_DEBUG
が true に設定されている場合、この Yii アプリケーションはデバッグモードで実行されます。 デバッグ モードは開発段階では便利ですが、一部のコンポーネントは追加のシステム オーバーヘッドを引き起こすため、パフォーマンスに影響します。たとえば、メッセージ ロガーは、ログに記録されたメッセージごとに追加のデバッグ情報を記録します。 YII_DEBUG
被定以为 true,这个 Yii 应用将以调试模式运行。 调试模 式在开发阶段是有用的,但是它影响性能因为一些组件引起额外的系统开销。例如,信息记录器(the message logger)将为 被条被记录的信息记录额外的调试信息。
yiilite.php
当启用 PHP APC 扩展 时, 我们可以将 yii.php
替换为另一个名为 yiilite.php
的引导文件来进一步提高 Yii-powered 应用的性能。
文件 yiilite.php
包含在每个 Yii 发布中。它是一些常用到的 Yii 类文件的合并文件。在文件中,注释和跟踪语句都被去除。因此,使用 yiilite.php
将减少被引用的文件数量并避免执行跟踪语句。
注意,使用 yiilite.php
而不开启 APC 实际上将降低性能,因为 yiilite.php
包含了一些不是每个请求都必须的类,这将花费额外的解析时间。 同时也要注意,在一些服务器配置下使用 yiilite.php
将更慢,即使 APC 被打开。 最好使用演示中的 hello world
运行一个基准程序来决定是否使用 yiilite.php
。
如在 缓存 章节所述,Yii 提供了几个可以有效提高性能的缓存方案。 若一些数据的生成需要长时间,我们可以使用数据缓存 方法来减少数据产生的频率;若页面的一部分保持相对的固定,我们可以使用 碎片缓存 方法减少它的渲染频率;若一整个页面保持相对的固定,我们可以使用 页面缓存 方法来节省页面渲染所需的花销。
若应用在使用 Active Record,我们应当打开 数据结构缓存 以节省解析数据表结构的时间。可以 通过设置CDbConnection::schemaCachingDuration 属性为一个大于 0 的值来完成。
除了这些应用级别的缓存技术,我们也可使用服务级别的缓存方案来提高应用的性能。 事实上,我们之前描述的PHP APC 缓存 就属于此项。 也有其他的服务器技术,例如 Zend Optimizer, eAccelerator, Squid,其他不一一列出。
从数据库取出数据经常是一个网络应用的主要瓶颈。虽然使用缓存可以减少性能损失,它不能解决根本问题。 当数据库包 含大量数据而被缓存的数据是无效时,如果没有良好的数据库和查询优化设计,获取最新的数据将会非常耗费资源。
在一个数据库中聪明的设计索引。索引可以让 SELECT
查询更快, 但它会让 INSERT
, UPDATE
或 DELETE
查询更慢。
对于复杂的查询,推荐为它创建一个数据库视图,而不是通过PHP代码生成查询语句让DBMS来重复解析他们。
不要滥用 Active Record。虽然 Active Record 擅长以一个 OOP样式模型化数据, 它实际上为了它需要创建一个或几个对 象来代表每条查询结果降低了性能。 对于数据密集的应用,在底层使用 DAO 或 数据库接口 将是一个更好的选择。
最后但并不是最不重要的一点,在你的 SELECT
查询中使用 LIMIT
yiilite.php
を使用しますPHP APC 拡張機能が有効になっている場合、yii.php
を yiilite.php
という名前の別の拡張子に置き換えることができます。 code> ブートファイルを使用すると、Yii を利用したアプリケーションのパフォーマンスがさらに向上します。 ファイル yiilite.php
はすべての Yii ディストリビューションに含まれています。これは、一般的に使用されるいくつかの Yii クラス ファイルをマージしたファイルです。ファイルでは、コメントとトレース ステートメントが削除されます。したがって、yiilite.php
を使用すると、参照されるファイルの数が減り、トレース ステートメントの実行が回避されます。 APC を有効にせずに yiilite.php
を使用すると、実際にパフォーマンスが低下することに注意してください。これは、yiilite.php
にはすべてのリクエストに必要ではないクラスが含まれており、余分な解析に時間がかかるためです。時間。 また、APC がオンになっている場合でも、一部のサーバー構成では yiilite.php
の使用が遅くなることに注意してください。 yiilite.php
を使用するかどうかを決定するには、デモの hello world
を使用してベンチマークを実行するのが最善です。 🎜🎜4. キャッシュテクノロジーを使用する🎜🎜 キャッシュの章で述べたように、Yii はパフォーマンスを効果的に向上させることができるいくつかのキャッシュソリューションを提供します。 一部のデータの生成に時間がかかる場合は、データ キャッシュ方式を使用してデータ生成の頻度を減らすことができます。ページの一部が比較的固定されたままである場合は、フラグメント キャッシュ方式を使用してそのレンダリング頻度を減らすことができます。ページ全体が比較的固定されたままになる 固定されたため、ページ レンダリングのコストを節約するためにページ キャッシュ方法を使用できます。 🎜🎜アプリケーションがアクティブ レコードを使用している場合は、データ テーブル構造の解析時間を節約するためにデータ構造キャッシュをオンにする必要があります。これを実現するには、CDbConnection::schemaCachingDuration プロパティを 0 より大きい値に設定します。 🎜🎜これらのアプリケーション レベルのキャッシュ テクノロジに加えて、サービス レベルのキャッシュ ソリューションを使用してアプリケーションのパフォーマンスを向上させることもできます。 実際、前に説明した PHP APC キャッシュはこのカテゴリに分類されます。 Zend Optimizer、eAccelerator、Squid などの他のサーバー テクノロジーもありますが、その他は 1 つずつリストされています。 🎜🎜5. データベースの最適化🎜🎜 多くの場合、データベースからのデータの取得がネットワーク アプリケーションの主なボトルネックになります。キャッシュを使用するとパフォーマンスの低下を軽減できますが、根本的な問題は解決されません。 データベースに大量のデータが含まれており、キャッシュされたデータが無効な場合、適切なデータベースとクエリの最適化設計がなければ、最新のデータを取得するのに非常に多くのリソースが消費されます。 🎜🎜データベース内のスマートに設計されたインデックス。インデックスを使用すると、SELECT
クエリは高速化できますが、INSERT
、UPDATE
、または DELETE
クエリは遅くなる可能性があります。 🎜🎜複雑なクエリの場合は、PHP コードを通じてクエリ ステートメントを生成し、DBMS に繰り返し解析させるのではなく、データベース ビューを作成することをお勧めします。 🎜🎜アクティブ レコードを悪用しないでください。 Active Record は OOP スタイルでのデータのモデリングに優れていますが、各クエリ結果を表すために 1 つまたは複数のオブジェクトを作成する必要があるため、実際にはパフォーマンスが低下します。 データ集約型のアプリケーションの場合は、内部で DAO またはデータベース インターフェイスを使用することをお勧めします。 🎜🎜最後に重要なことですが、SELECT
クエリで LIMIT
を使用してください。これにより、データベースから大量のデータがフェッチされ、PHP に割り当てられたメモリが使い果たされることが回避されます。 🎜🎜6. スクリプト ファイルを最小限に抑える🎜🎜複雑なページでは、多くの外部 JavaScript および CSS ファイルの導入が必要になることがよくあります。 各ファイルによって余分な往復が発生するため、ファイルを結合してスクリプト ファイルの数を最小限に抑える必要があります。 ネットワーク転送時間を短縮するために、各スクリプト ファイルのサイズを減らすことも検討する必要があります。両方の側面を改善するのに役立つツールが多数あります。 🎜🎜 Yii で生成されたページの場合、変更したくないコンポーネント (Yii コアコンポーネント、サードパーティコンポーネントなど) によってレンダリングされる一部のスクリプトファイルは例外です。 これらのスクリプト ファイルを最小化するには、2 つの手順が必要です。 🎜注: 以下で説明する
scriptMap
機能は、バージョン 1.0.3 以降でサポートされています。scriptMap
特征已自版本 1.0.3 起被支持。
首先,通过配置应用组件 clientScript 的 scriptMap 属性来声明脚本被最小化。 可以在应用配置中完成,也可以在代码中配置。例如,
$cs=Yii::app()->clientScript; $cs->scriptMap=array( 'jquery.js'=>'/js/all.js', 'jquery.ajaxqueue.js'=>'/js/all.js', 'jquery.metadata.js'=>'/js/all.js', ...... );
上面的代码所做是映射这些 JavaScript 文件到 URL /js/all.js
。 若这些 JavaScript 文件任何之一需要被一些组件引入, Yii 将引入这个 URL (一次) 而不是各个独立的脚本文件。
其次,我们需要使用一些工具来联合 (和压缩) JavaScript 文件为一个单独的文件,并保存为 js/all.js
。
相同的技巧也适用于 CSS 文件。
在 Google AJAX Libraries API 帮助下我们可以改善页面载入速度。例如,我们可以从 Google 的服务器引入jquery.js
而不是从我们自己的服务器。要这样做, 我们首先配置 scriptMap
$cs=Yii::app()->clientScript; $cs->scriptMap=array( 'jquery.js'=>false, 'jquery.ajaxqueue.js'=>false, 'jquery.metadata.js'=>false, ...... );
/js/all.js
にマップします。 これらの JavaScript ファイルのいずれかをコンポーネントにインクルードする必要がある場合、Yii は個々のスクリプト ファイルの代わりにこの URL を (1 回) インクルードします。 次に、いくつかのツールを使用して JavaScript ファイルを 1 つのファイルに結合 (圧縮) し、js/all.js
として保存する必要があります。
同じトリックは CSS ファイルにも機能します。
Google AJAX ライブラリ API を利用すると、ページの読み込み速度を向上させることができます。たとえば、jquery.js
を独自のサーバーではなく Google のサーバーからインポートできます。これを行うには、まず scriptMap
を次のように設定します。
<head> <?php echo CGoogleApi::init(); ?> <?php echo CHtml::script( CGoogleApi::load('jquery','1.3.2') . "\n" . CGoogleApi::load('jquery.ajaxqueue.js') . "\n" . CGoogleApi::load('jquery.metadata.js') ); ?> ...... </head>