4

について私の理解が正しいかどうかを確認したいのですがrequire_once()。file にはたくさんの関数がありますfoo.php。それらの 7/8 が常に使用され、そのうちの 1 つはかなりまれで、かなり大きいとしましょう。この関数の定義を に保持する必要がありfoo.phpます。次のアプローチが何かを達成するかどうか、そしてそれが達成する価値があると思うかどうか教えてください.

  • 関数の本体を取り出して、外部ファイルに入れます。
  • 元の関数をrequire_once()その特定のファイルに再定義し、実行をヘルパー関数に渡します。

これにより、その関数が実行されていないリクエストでサーバーのメモリを節約できることを理解しています。しかし、私は正確に何を節約していますか?関数の本体を保持するのに必要なメモリだけですか? それは、価値があると思う前に、かなり大きな機能でなければならないことを意味します。また、APC のようなものを使用していると、あまり役に立たなくなりますか?

適宜修正・追記お願いします!

どうもありがとうございました。

4

3 に答える 3

2

別のファイルにリファクタリングすることで何かが得られるとは思えません。また、これを検討するようになった現在のコードに実際に問題はありますか? 時期尚早の最適化が諸悪の根源であることはご存じでしょう。無意味なマイクロ最適化に時間を浪費する前に、コードをプロファイリングして、ボトルネックがあるかどうか、どこにあるかを確認してください。

于 2010-08-23T10:20:28.107 に答える
1

更新:ゴードンへのコメントから、あなたが Drupal を使用しているように見えます: Drupal はすでにかなりオブジェクト指向であるため、この方法はそこで機能しません。ここで説明するのは、静的クラスを使用する関数ベースのプロジェクトのオートローディング メカニズムを利用することです。

ゴードンが言うように、これは本当に信じられないほど巨大な関数に対してのみメモリを節約します。ただし、私の経験では、インクルードをメモリにロードすると、コードを保持するために必要な正確なバイト数よりもはるかに多くのスペースが必要になります。私は PHP の内部構造の専門家ではありませんが、コードが解析されているか、少なくともいずれかの方法で前処理されていると思います。

PHP アプリケーションが完全に OOP のない関数ベースであると仮定すると、インクルードを分割するために使用できる 1 つのアイデアは、関数をクラスに入れ、オートローダー メカニズムを利用することです。

class maintenance_functions
 { 

   public static function xyz() { ................  }

そしてそれらを静的に呼び出し始めます:

 maintenance_functions::xyz();

1 つのクラスが 1 つのファイルを占有します。

めったに使用されない関数をすべて別のファイルにグループ化します。

次に、オートローディングメカニズムを利用できます。これにより、必要なクラスが必要な時点で自動的にロードされます。たとえば、私が電話する場合

 datamining_functions::xyz();

オートローダーは、それを含むファイルを探してdatamining_functionsインクルードします。これにより、'require()' の手間が完全になくなり、関数を最も効率的にグループ化する方法に集中できます。

これは実際の OOP への移行ではありません。オートローダを使用できるようにするために、クラス コンストラクトを使用して関数をグループ化するだけです。大幅な書き直しを必要とせずに、関数をそのようなクラスに移行できるはずです。

于 2010-08-23T10:30:50.327 に答える
0

Xdebugを使用 して答えを見つける必要があります-価値があるかどうかは主観的です。

于 2010-08-23T10:35:20.513 に答える