1

私たちのオンライン ゲームでは、大量の PHP クラスと関数を作成し、テーマごとにグループ化し、ファイルとフォルダーに分けました。最後に、ライブラリと呼ばれる一連のファイルにすべてのバックエンド コード (ロジックおよび DB アクセス レイヤー) があり、include_once('pathtolib/file. inc') .

問題は、私たちがインクルージョンに怠惰であり、ほとんどのインクルード ステートメントが libs ファイル内で作成されていることです。その結果、各 Web ページから libs ファイルをインクルードするたびに、実際には libs 全体をファイルごとにロードします。

これは、パフォーマンスに大きな影響を与えます。したがって、最善の解決策は何ですか?

  • libs ファイルからすべての include ステートメントを削除し、Web ページから必要なものだけを呼び出しますか?
  • 何か他のことをしますか?

サーバーは従来の LAMP スタック (PHP5) を使用します。

編集: 単純な関数 (従来の理由とコードの大部分) とクラスが混在しています。したがって、オートロードでは十分ではありません。

4

8 に答える 8

3
  • すべてのインクルードを手動で管理し、必要な場合のみ
  • include_path を必要な場所にのみ設定します。デフォルトは .:/usr/lib/pear/:/usr/lib/php のようなもので、必要な場所だけを指定します。php.net/set_include_path
  • 自動ロードは使用しないでください。速度が遅く、APC および同等のキャッシュ ジョブが非常に難しくなります。
  • APC で「stat」操作をオフにすることはできますが、ファイルを更新するたびに手動でキャッシュをクリアする必要があります。
于 2008-09-18T15:07:40.400 に答える
3

オブジェクト指向の方法でプログラミングを行った場合は、autoload関数を利用できます。この関数は、クラスを呼び出したときにオンデマンドでソース ファイルからクラスをロードします。

編集:誰かがオートローディングに言及した両方の回答に反対票を投じたことに気付きました。私たちは間違っていますか?__autoload 関数のオーバーヘッドが高すぎて、パフォーマンス目的で使用できませんか? このテクニックについて私が気付いていないことがあれば、それが何であるかを知りたいと思っています。

于 2008-09-18T14:55:59.570 に答える
3

本当にハードコアになりたい場合は、静的分析を行い、いつどのライブラリが必要かを正確に把握し、それらのみを含めます。

を使用し、を使用includeしない場合include_onceは、スピードも多少節約されます。

そうは言っても、Zend Optimizer に関する Matt の回答は的を射ています。必要に応じて、オペコード キャッシュである Advanced PHP Cache (APC) を無料でお試しください。PECL リポジトリにある必要があります。

于 2008-09-18T15:05:11.670 に答える
2

spl_autoload_register() または __autoload() を使用して、クラスに必要なファイルを含めるために必要なルールを作成できますが、autoload は独自のパフォーマンス オーバーヘッドを導入します。使用するものは何でも、php.ini 設定または apache 構成を使用して、すべての gui ページの先頭に追加する必要があります。

汎用関数を含むファイルの場合、それらをユーティリティ クラスでラップし、単純な検索と置換を実行して、すべての function() 呼び出しを util::function() に置き換えることをお勧めします。これにより、これらの関数を自動ロードできるようになります。 (ここでも、グローバル関数ではなくメソッドの呼び出しにオーバーヘッドが発生します)。

基本的に最善の方法は、コードを見直して、インクルードの問題を修正することで設計の負債を返済することです。これにより、パフォーマンスが最大限に向上し、eAccelerator、Zend Platform、APC などのオプティマイザを最大限に活用できます。

これは動的に物をロードするためのサンプルメソッドです

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}
于 2008-09-18T15:13:44.707 に答える
2

あなたが探しているのはAutomap PECL extensionです。

基本的に、事前に計算されたマップ ファイルをロードするわずかなオーバーヘッドで、自動ロードが可能になります。特定のディレクトリが特定の PHP ファイルからのみプルされることがわかっている場合は、マップ ファイルを分割することもできます。

詳細については、こちらをご覧ください。

于 2008-09-18T20:31:56.830 に答える
1

プロファイラーを使用します。対策を講じずに最適化しようとすると、盲目的に作業していることになります。

于 2008-09-18T20:00:00.680 に答える
1

PHP を使用してからしばらく経ちましたが、この場合は Zend Optimizer または Cache が役立つのではないでしょうか? PHPは、すべてのリクエストに対して、含まれているすべてのファイルを再度ロードしてコンパイルしますか?

自動読み込みが答えかどうかはわかりません。これらのファイルが含まれている場合、それらはおそらくそれを含むクラスで必要とされるため、とにかく自動ロードされます。

于 2008-09-18T15:00:11.993 に答える
1

バイト コード キャッシュ (理想的には APC) を使用して、ページが読み込まれるたびに PHP がライブラリを解析する必要がないようにします。autoload を使用すると、バイト コード キャッシュを使用するメリットがなくなることに注意してください (詳細については、こちらを参照してください)。

于 2008-09-18T15:06:36.470 に答える