web-dev-qa-db-ja.com

Drupalキャッシュとhook_init

そのため、hook_init()を使用して何かを行うことを検討していましたが、「このフックはキャッシュされたページでは実行されません」と表示された場合の意味がわかりません。まあ、本当に?

実験として、匿名ユーザーのキャッシュがオンになっていることを確認し、ログインしていないブラウザウィンドウでサイトにアクセスしました。キャッシュページが確実に表示されていましたね。次に、これを自分のモジュールに追加しました

function mymodule_init() {
  $num = Rand(0,1000);
  drupal_set_message($num); 
}

フックが実行されていない場合、ページを表示するたびに乱数を取得するべきではないと考えました。メッセージを受け取るべきかどうか確信が持てませんでした!しかし、毎回異なる乱数を取得しています。では、フックがキャッシュされたページで実行されていないというのは、どういう意味ですか?そして、いつこのフックを使用しても大丈夫ですか?わからないことが明らかな場合は申し訳ありません。

-編集-

答えてくれてありがとう。 drupal_set_messageが原因でページがキャッシュされないことに気付いたはずです。それで私は戻ってJavaスクリプトを次のように追加してみました:

function mymodule_init() {
  $num = Rand(0,1000);
  drupal_add_js(array('mymodule' => array('Rand' => $num)), 'setting');

  $path = drupal_get_path('module', 'mymodule');
  drupal_add_js($path . '/js/mymodule.js');

  echo $num;
}

そして私のjavascriptファイルで:

(function ($) {
    Drupal.behaviors.mymodule = {
        attach: function(context,settings) {
            var num = Drupal.settings.mymodule.Rand;

            alert(num);
        }
    }
})(jQuery)

それでも毎回乱数を警告しているようです。 drupal_add_jsもキャッシュを無効にしますか? hook_init()で単純なエコーステートメントを使用してみましたが、それでも乱数がエコーされているように見えました。これらのすべてが原因でページがキャッシュされないのですか、それともhook_init()がなんらかの理由で実行されるのですか?

1
Benjamin Thvedt

ここにいくつかのこと:

  1. hook_init()は、ページの最初のヒットで実行されます。たとえば、まだキャッシュにない場合は、実行されてからページがキャッシュされます。だが...

  2. drupalメッセージがある場合、ページはキャッシュされません。そのため、drupal_set_message()を呼び出すと、drupal_page_is_cacheable(FALSE);が設定され、ページはキャッシュされません。 。

添加:

JavaScriptに関する追加コードについて:このコードを逐語的にここに追加するとnotがサイトに表示されるランダムな動作を示します。例えば;ここでは、キャッシュが更新されるまで同じ番号が表示されます。

これについて私は考えさせられました。キャッシュ時間を確認します。

enter image description here

時刻が<none>に設定されている場合、私はあなたが経験しているように見える動作を見ますが、それらが他の何かに設定されている場合、例えば:

enter image description here

その後、私はしません。

6
Jimajamma