web-dev-qa-db-ja.com

多くの完全なノードオブジェクトをロードする高性能な方法

ノードオブジェクトの束をロードして、それらにいくつかのアルゴリズムを適用する必要があります。
通常は内部で反復とnode_load()を使用しますが、ノードオブジェクトをロードするための(パフォーマンスといえば)より良い方法があるかどうか疑問に思っていました。

アルゴリズムの結果をページごとにキャッシュできれば十分だと思います。

2
Nils Riedemann

node_load()は、ノードオブジェクトが一部の関数に渡される場合は特に、ノードオブジェクトをロードするための望ましい方法です。
Drupal 6では、node_load()の結果はデフォルトでローカルに静的変数にキャッシュされることに注意してください。束をロードする場合ノードの場合、node_load($id, NULL, TRUE)として関数を呼び出す方が良いです。何らかの理由で、コードがnode_load()の連続呼び出しで同じノードをロードできることが確実な場合は、 Xがnode_load()を呼び出した後、静的な値をリセットすることを検討できます。
関数に渡される_$revision_パラメータがNULLでない場合、node_load()の結果はキャッシュされません。

node_load()から取得した値をキャッシュすることは可能であり、コードはその目的で独自のキャッシュを使用できます。ノードが更新されると、キャッシュは無効になります。これには、ノードが以前のリビジョンに戻される場合も含まれます。独自のモジュールにキャッシュを実装するよりも、サードパーティのモジュールのノードをキャッシュするモジュールを使用する方が良いでしょう。

Drupal 7では、node_load()node_load_multiple()の両方が_$reset_パラメータを受け入れ、インスタンス変数として保持されているノードキャッシュをクラス NodeControllerDrupalDefaultEntityController によって実装されるインスタンス変数を使用するDrupalから作成されます。これは、エンティティコントローラーに必要なデフォルトメソッドを実装するクラスです。

2
kiamlaluno

Drupal 6.で私が知る他の方法はありません。

Drupal 7にはnode_load_multiple()があり、単一のクエリで複数のノードをロードできます(+フック。複数のノードに対して単一のクエリを実行することもできます)。さらに、読み込まれたエンティティをキャッシュできる Entity cache プロジェクトがあります。

1
Berdir