2009-07-14 7 views
3

Drupalは現在のユーザーによって読み込まれているコンテンツとは無関係のフックを解析しますか?例えばDrupalは使用されていないフックを解析しますか?

、私はモジュールfooは次のフックをインストールし、アクティブしていたと言う:

<?php 
// .. stuff ...  
function foo_menu() { 
     $items = array(); 
     $items['foo/show'] = array(
     'title' => t('Foo!'), 
     'page callback' => 'foo_display_all', 
     'description' => 'All our foo are belong to you', 
     'type' => MENU_NORMAL_ITEM, 
    ); 
     return $items; 
    } 

    function foo_display_all() { 
    // About 100 lines of code 
    } 
// ... stuff ... 

うDrupalの解析foo_menuに記載されていないページの(したがって、ロード時間に影響を与えますか)?つまり、foo_display_allの長さと複雑さは、www.example.com/barがどのようにロードされるのでしょうか?

ここでは2つの異なる質問が出る危険がありますが、私は、Drupalがはい/いいえの答えではなく、どうやって解析するのか、またなぜ解析しないのかについての説明(または説明へのリンク)に感謝します。

答えて

6

hook_menuは、特定のURLで何をすべきかをdrupalに伝えるために使用されるため、その結果がキャッシュされます。

Drupalは、フック自体のコンテンツを、それらが配置されているファイルの内容全体ではなく実行します。したがって、上記の例でフックメニューが呼び出されると、foo_menu()関数が実行されます。あなたはHooks API

編集のイントロのテキストを見てとることができ :PHPの関数を実行するためには を、それが置かれているファイルをインクルードする必要があります。したがって、Drupalがフックを実行したい場合、PHPはそのファイル内のコードを解析する必要があります。それはPHPがどのように設計されているかであり、Drupalとはあまり関係がありません。

これは、多くのモジュールが多くのincファイルを作り、フックが起動されたときに解析する必要があるコードの量を制限する理由です。

+0

ありがとうございました。しかし、ファイルが読み込まれ、解析されるかどうかさらに疑問に思っていました。私はDrupalが未使用の関数を実際に実行しないほどスマートであることに感謝しますが、読み込み/解析して無視するかどうかはわかりません。それが必要でない限り、それをまったく読んでいなければ。 おそらく、これはあなたが意味したものですか? – anschauung

+1

私はあなたがそれをincファイルにしたくないと思っています。 –

+0

説明をありがとう。 .incファイルの使用に関するあなたの答えは、以下のCraigの答えにいくらか矛盾しますが、私はそれを解決するために新しい質問を投稿します。 – anschauung

3

Drupalには、すべてのモジュールごとに、すべてのMODULE.moduleファイル(およびそれらに含まれるもの)がすべて含まれています。

モジュールで呼び出しが必要なフックがあるかどうかをDrupalコアが知る唯一の方法は、ファイルをロードすることです。これには時間と記憶が必要です。すべての

+0

ありがとうございます。 .incファイルの使用に関するあなたのコメントは、@ googletorpの答えといくぶん矛盾しますが、新しい質問がそれを解決する最善の方法だと思います。 – anschauung

+0

.moduleファイルに関数内のインクルードステートメントがある場合、インクルードされたファイルは関数が呼び出されたときにのみ読み込まれます。インクルードがグローバルスコープの場合、インクルードファイルは常に読み込まれます。 – Craig

3

ファーズは、私は2番目の、それは、私はこれを試したことのない素敵な実装と第三はありませんが、経験豊富なDrupalの開発者ではないんだけど、

function foo_display_all() { 
    include("foo_display_all_body.php"); 
} 

フックが解析される。このように動作しなければなりません毎回、関数本体を持つ+ 1つの追加のPHPファイル。

第4に、マイクロ最適化です。追加の複雑さ(および+1ファイルの読み込み量)は、解析時に保存するよりも長期間に渡って多くの費用がかかりますので、絶対に必要でない場合は避ける方がよい場合があります。あなたがより速く解析するPHPコードを作成したい場合は

、あなたはオペコードキャッシュ

4

はいを​​使用する必要があります。他の人が指摘しているように、条件付きでロードされるインクルードファイルに物を分割することは、それを減らす唯一の方法です。 Drupal 6以降、theme_whatever()関数とhook_menu()ページコールバックを別々のインクルードファイルに移動することが可能になりました。あなたが明示的なrequire_once()ジャグリングをしないと、Drupalは必要なときに自動的にそれらをロードします。

詳細については、hook_menu()およびhook_theme()のマニュアルを参照してください。

それはあなたが含まれる条件付きの束にAPC、分割物事のようなオペコード・キャッシュを実行している場合、実際に悪化しであることに注意することも重要です - APCはでPHPのソースの解析とコンパイルのすべてを行うことができます1つは行くと要求の間にそれを維持します。条件付きで物を分割するだけで、何が行われているかに応じてコンパイルするための複数の離散的な「コードベース」が得られます。

現在開発中のDrupal 7では、フックの実装を別のインクルードファイルに分割することを可能にする一般的なCode registryが追加されました。しかし、関数と.incの場所の内部キャッシュを管理し、それらを即時にロードするオーバーヘッドは、より小さい解析コードベースのパフォーマンス向上を犠牲にします。唯一の本当の効果は、12-16メガバイトのメモリ制限が厳しい共有ホスト上のメモリ使用量の削減です。トレードオフを考えれば、その変更がDrupal 7の最終リリースまで生き残るかどうかは不明だ。

Drupal 6のupshot:は、カスタムページを個別の.incファイルに作成するメニューコールバックを分割し、それらのページがビルドされたときにのみロードされます。どんなテーマ機能でも同じことをしてください。 オペコードキャッシュ(APCなど)を使用している場合は、別々の.incファイルが組織目的にのみ適していることを覚えておいてください。パフォーマンスの向上は期待できません。

+0

偉大な答え - 詳細な説明のおかげで! – anschauung

0

APCは.incファイルだけでなく、パフォーマンスを大幅に向上させるPHPをキャッシュするようです。

関連する問題