7

Zend Framework を使用するアプリケーションから、できるだけ多くのパフォーマンスを得ようとしています。

APC を有効にして Zend サーバーを使用することを検討しています。ただし、最初にいくつかのことを知っておく必要があります。

Zend Server + Zend Framework を使用する利点はありますか、それとも通常のシステムを使用してこれをホストする必要がありますか?

シャミル

4

5 に答える 5

26

より高速なZFのための私のヒント(上から下に試してください):

インクルードパスの最適化

  • 最初にパスをzend
  • 次のモデル
  • 最後に休む

OPCacheを有効にしてPHP5.5を使用する[NEW]

  • 私はこれを十分に強調することはできません
  • 約50%増加

テーブルメタデータをキャッシュする

  • 他のキャッシュが必要ない場合でもキャッシュする必要があります
  • アプリケーションのパフォーマンスの1つは、Oracleサーバーで最大30%向上しました;)

action()ビューヘルパーの使用よりもviewHelpersを優先する

  • モデルにアクセスするビューヘルパーを作成します
  • または、モデルからのデータのみを渡し、ビューヘルパーでフォーマットします

クラスマップオートローダーを使用する

  • ZF1.11以降
  • できればrequire_once呼び出しを削除して

パススタックを最小化する

  • ZFにはたくさんのパススタックがあります
    • フォーム要素
    • ヘルパーを表示
    • アクションヘルパー
  • 各パススタックルックアップは、統計呼び出し=パフォーマンスの低下を意味します
  • デフォルトのクラスは、スタック上のすべてのパスでますます高価になります

require_onceを削除します

  • find&sedを使用した自動読み込みを優先して、Zendのクラスからrequire_onceを削除します

部分()ビューヘルパーよりもrender()を優先する

  • 新しいビューインスタンスは作成されません
  • レンダリングされたビュースコープの外側、メインビューの内側に変数を設定する必要があります。
  • partialLoop()foreach + render()に置き換えることもできます

可能な限りキャッシュする

  • 多くの作業を必要とし、めったに変更されない小さなチャンク(動的メニューのように)
  • プロファイラーを使用して、ぶら下がっている果物を見つけます
    • あなたが遅いと思うものは実際にはそれほど遅くないかもしれません
  • キャッシュを静的に設定できるすべてのものをキャッシュする
    • マニュアルを参照してください-Zend_Locale::setCache(), Zend_Currency::setCache(), Zend_Db_Table::setDefaultMetadataCache(), configs...

ビューヘルパーaction()またはアクションヘルパーactionStack()は絶対に使用しないでください

  • 100%必要な場合を除いて、これらを使用しないでください。たとえば、複雑なデータ出力の場合ですが、パフォーマンスの低下に注意してください。
  • それらはまったく新しいディスパッチループを作成し、パフォーマンスキラーです!

viewRendererを無効にする

私のsuperlimunalプラグインを試してください

  • 含まれているクラスを1つの長いファイルにマージして、統計呼び出しを最小限に抑えます
  • GitHubから取得する
    • EDP​​のZF2バージョンからの移植です
    • ただし、注意してください。本番環境ではまだテストされていません。注意して使用してください
  • パフォーマンスの向上を測定する
    • 遅いHDDとその中のすべてのZFクラスで私にとって損失がありました
    • ストリップ空白関数で最小化してみてください

サーバー側のファイルの縮小

  • 本当に大きなファイルには意味があります-HDDは常にボトルネックです
  • マイクロ最適化でもうまくいくことがあります
    • すべてのZFクラスのパスを含むクラスマップは巨大で、空白をストライピングし、長い変数を置き換えて、$a$bドライ」オペコードキャッシュとHDDに圧力がかかっているときにパフォーマンスを向上させます。

もちろん、オペコードキャッシュは必須です;)(APC、ZendOptimizerなど)

于 2011-01-17T21:55:50.053 に答える
3

APC は、実行しているスタックの種類に関係なく役立ちます。あらゆる種類の OPcode キャッシングが可能です。

アプリケーションを高速化するための最初のステップは、プロファイルを作成することです。Xdebug を使用して cachegrind レポートを生成し、kcachegrind や webgrind などを使用して解釈します。

Zend Framework での作業から、私が通常見つけるいくつかの問題点を以下に示します。

  • 構成ファイルは計算にかなりの負荷がかかります。最終的な構成オブジェクトを取得したら、それをキャッシュしてください!
  • ファイル インクルードは非常にコストがかかるため、最小限に抑えてください。リフレクションベースのもののためにファイルを頻繁に開いている場合は、そこに出力をキャッシュしてください。
  • データベースの呼び出しはコストがかかる可能性がありますが、中心的なタスクでない限り、通常は部屋にいる必要はありません。

ページ レベルのキャッシュは非常に役立ちます。新しいデータを必要としない場所はどこでも、キャッシュします。

それを過ぎると、Zend フレームワークやサーバーの問題が少なくなり、本質的にアーキテクチャになり始めます。負荷の高いタスクを非同期で実行できますか? 何かを最適化する価値がない場合もありますが、ユーザーの認識をより速く感じるように変更する価値はあります。

おもしろい考えですが、先日、$i++ をバックスペースして +$i に置き換えました。技術的には高速ですが、それを行うのにかかった時間は、プログラムの存続期間中に取り戻すことはできないと確信しています。どこかに線を引く必要があります:)

于 2011-01-17T04:47:59.343 に答える
1

オペコード キャッシングは、運用環境で PHP を実行するときに常に使用したい拡張機能の 1 つです。Apc はオペコード キャッシングとデータ キャッシング拡張機能ですが、Zend サーバーでは、主要なオペコード キャッシングは「オプティマイザー プラス」と呼ばれ、APC の使用を決定する前に 2 つのパフォーマンスを比較することをお勧めします。Zend サーバーには、データ キャッシング ジョブを実行する別の拡張機能もあります。多くのファイル インクルード (Zend フレームワークなど) は、メモリにコンパイルされて格納され、使用を開始するのに時間がかからないため、op-code キャッシングの問題ではなくなりました。

Zend サーバーのフル (有料) バージョンでは、アプリケーションの問題や最適化されていないコードに関する貴重な情報を提供するコード トレースと組み合わせて PHP 監視を使用することにより、もう 1 つの大幅なパフォーマンスの向上を実現できます。長いスクリプトと関数の実行、長い DB クエリなどの問題は、この組み合わせで非常に高速に解決できます。

于 2011-01-17T08:37:07.920 に答える
1

Zend Server は非常に一般的に言えば PHP コンパイラ (LAM Pまたは WAM Pスタックの P) ですが、はるかに高度であり、(php.ini を編集する代わりに) すべてを設定するための優れた GUI を提供しますが、さらにインポートされたもの:

  • APC
  • キャッシュ (データ i ページ レベル)
  • ジョブクエリ
  • デバッグによる高度な監視

APC のみを探している場合は、おそらく他のソリューション (私はまだ知りません) の方が安くなる可能性がありますが、APC が必要な場合は、キャッシングとジョブクエリが必要であることが示唆されます... 私はそれが大好きです.

Zend Framework を使用する必要はありませんが、任意のフレームワーク (またはフレームワークなし) を使用できます。

ZS のフル機能を 30 日間無料で試すことができるのは素晴らしいことです (APC は CE では利用できません ---->>>> CE では間違った APC が利用できます)。

于 2011-01-16T23:22:30.783 に答える
0

ソース このヒントは新しいものではありません。これは Zend Framework のドキュメント ( Zend Framework Performance Guide ) から直接引用したもので、省略した部分を除いて書かれたものを使用しました。

Zend_Loader を使用してすべての require_once を削除

すべての require_once ステートメントを実際に削除することはできません。Zend_Loader をロードするには、少なくとも 1 つの require_once が必要です。まず、Zend Loader を有効にします。

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

次に、Zend ディレクトリ内のすべてのファイルのすべての require_once ステートメントを削除します。Eclipse PDT を使用している場合は、検索と置換機能を使用できます。

Zend_Cache を使用して Zend_Db_Table メタデータをキャッシュする

Zend_Db_Table を使用している場合 (Zend_Db しか使用しないこともありました)、データベースからデータを取得しようとすると、最初に呼び出されるクエリがテーブルの DESCRIBE であることに気付くでしょう。Zend_Db_Table は、DESCRIBE クエリの情報を使用して、SELECT でその魔法を実行します。

クエリのプロファイリングを行ったところ、DESCRIBE クエリが (ほとんどの場合) 最長のクエリであることに気付きました。これは、検索操作に大きなオーバーヘッドがかかることを意味します。次の 2 つのオプションがあります。

(A) Zend_Db_Table を使用しない (Zend_Db を使用) (B) メタデータをキャッシュする

この投稿では、MetaData のキャッシュを使用します。ブートストラップ ファイルに、次のコードを追加します。

//Caching
$frontendOptions = array(
                    'lifetime'                  => 25200,
                    'automatic_serialization'   => true
                    );
$backendOptions  = array(
                     'cache_dir'                => APPLICATION_PATH . '/tmp'
                    );          
$cache = Zend_Cache::factory(
                    'Core',
                    'File',
                    $frontendOptions,
                    $backendOptions
                    );
//Cache table metadata
Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

キャッシュ プラグイン ローダー クラス ファイル

プラグインを使用する場合、Zend Framework は使用するプラグインに応じていくつかのファイルをインクルードし、適切なプラグインを見つけてインクルードするために数回の反復処理を行います。以下のコード コードでは、それらのプラグイン ファイルを含めるための include_once ステートメントのリストを作成します。このコードをブートストラップに含めるだけです。

//Plugin Loader caching
$classFileIncCache = APPLICATION_PATH .  '/data/pluginLoaderCache.php';
if (file_exists($classFileIncCache)) {
    include_once $classFileIncCache;
}
Zend_Loader_PluginLoader::setIncludeFileCache($classFileIncCache);

データのキャッシュ

データのキャッシュは最適化の最も重要な部分であり、繰り返しアクセスされるデータが既にキャッシュされている場合、データベースへのアクセスを大幅に節約できます。キャッシュの有効期限を設定し、データが変更されたときにキャッシュをクリアすることも重要です。簡単なキャッシングを以下に示します。

ブートストラップで:

//Caching
$frontendOptions = array(
                    'lifetime'                  => 25200,
                    'automatic_serialization'   => true
                    );
$backendOptions  = array(
                     'cache_dir'                => APPLICATION_PATH . '/tmp'
                    );          
$cache = Zend_Cache::factory(
                    'Core',
                    'File',
                    $frontendOptions,
                    $backendOptions
                    );

$registry->set('cache', $dbCache);

これは、役立つと思われる基本的な設定です。

于 2019-04-05T09:42:41.757 に答える