NP_EzCacheを全ページで有効にしたらNP_Captchaが効かなくなってた

Nucleusではアクセスがある度にDBを参照してPHPでページを組み立てて表示するのですが、NP_EzCacheを使うと、ページのHTMLのキャッシュを作ってくれて、2回目以降のアクセスではキャッシュを返してくれるようになり、処理が少ない分高速化できます。

一方、NP_Captchaは、ページを読み込む度に新しいキャプチャを生成し、コメント書き込み時にユーザーにその文字列を入力させることで、スパム投稿を防ぎます。
キャプチャは毎回違う内容が表示されなければ意味が無いので、キャッシュできません。

つまり、個別アイテムページではNP_EzCacheを有効にしてはいけないのです。
有効にしていると、画像に invalid key や already activated と表示されてしまい、認証ができなくなります。


さて、NP_EzCacheでキャッシュするURLを指定する方法ですが、説明に正規表現が使えるとあります。
どうなっているのかソースを見てみると、

if (preg_match('|^'.$url.'$|', $this->url)) {

こんな風に、オプションで入力したCache URLsを1行ずつ preg_match に入れて評価しています。
ということは、「正規表現が使えます」ではなく、「正規表現で書いて下さい」が正しい説明ですね。

正規表現だということは、ワイルドカードの * は使えず、 .* が正しい表現になります。
というわけで、こんな風に設定してみました。

/blog/
/blog/(index\.php)?\?page=([0-9]+)
/blog/(index\.php)?\?catid=([0-9]+)
/blog/atom\.php(.*)
/blog/xml-rss2\.php(.*)
/blog/(index\.php)?\?itemid=2

各アイテムページはキャッシュしないようにして、トップページ、次のページ、カテゴリのページ、ATOM、RSS2、それからコメント禁止にしてある自己紹介ページだけキャッシュするように設定しました。
このブログでは、Nucleusの機能であるブログを複数作る機能を使っていないために、なるべくblogidという変数はURLから除くようにしてあるので、その部分は省略していますが、使っている方はそれも入れないといけませんね。
これでだいたいのページがキャッシュされるはずです。

ちなみに、キャッシュは、新しい記事を投稿したり、コメントが付くと削除されます。
それから、Adminユーザーでログインしている間はキャッシュは効かなくなっているのでご注意下さい。

では効果を確かめてみましょう。

$ mysql database -p
mysql> SELECT url FROM nucleus_plug_ezcache;
+-----------------------------+
| url                         |
+-----------------------------+
| /blog/                      |
| /blog/?page=2               |
| /blog/atom.php              |
| /blog/index.php?catid=1     |
| /blog/index.php?itemid=2    |
| /blog/index.php?page=47     |
| /blog/xml-rss2.php          |
+-----------------------------+

ログアウトした状態で一通りのページを開くと、このように各ページがキャッシュされていることが確認できました。

個別アイテムページのキャッシュは諦めるしかありませんでしたが、この設定でその他の主要なページはキャッシュされるので、まあ良しとしましょう。

コメントを残す