PHP の出力をキャッシュする
お気づきの方もいると思いますが、このサーバで使っている共有 MySQL が時間帯により過負荷でクエリーが返ってこないことがあり、サイトの表示が異常に遅いことがあります。。 今年に入ってからなんですよね、、CMS を入れる人が増えたためでしょうか。
文句を言っていてもしょうがないので解決しようと考えました。 このサイトは WordPress の部分と自作のスクリプトの部分があり、どちらも MySQL に実データが入っています。 これらを速くするには、MySQL を使わずにコンテンツを出力するキャッシュの機構があれば良いわけです。
まず、WordPress 系は、
Ricardo Galli, de software libre > WP-Cache 2.0
WP-Cache is an extremely efficient WordPress page caching system to make your site much faster and responsive.
これで決まりですね。 WP の 1.6 系で標準採用されるようです。
MT の静的再構築と WP の動的構築の折衷案的な考え方で、サイトの変更にあわせて不整合が出ないようにキャッシュ管理してくれます。 キャッシュ内の一部分を動的にするといったこともできますので、ほとんどの方に適応できるのではないでしょうか。
ただ、Search Word Highlight のようなアクティブコンテンツを使うサイトではキャッシュされるとマズイです。 ”parts of the page stay dynamic” 機能をうまく使えばいけそうな気もしますが、WP自体 の関数を呼ぶのはなかなか大変そうです。 あと、キャッシュの効果も薄れると思われます。(クエリー数削減はできます)
とりあえず、自分でつくったプラグインが使えなくなるのも寂しいので WordPress 側はちょっと保留。
ということで、自作のスクリプトのほうに WP-Cache を参考にキャッシュを適応してみました。
ドキュメント – 作成したドキュメントがおいてあります。
こっちはリアルタイム出力が不要なためキャッシュしたほうが全然速くて良いですね。 あと、キャッシュしておけば DB登録作業中の様子が見えなくていいという利点があることに気が付きました。 🙂
実は掲示板もまったく同じスクリプトで実装されているのですが、こちらは自分以外も書き込みがあり、自動キャッシュ制御が必要なためとりあえずそのままです。
適当に書いたソースはこんなかんじです。
- define('CACHE_PATH', dirname(__FILE__) . '/documents/cache/');
- global $staticFileName;
- // キャッシュファイル名を URI からユニークに決定する
- $key = $_SERVER['REQUEST_URI'];
- $staticFileName = md5($key) . '.html';
- // キャッシュファイルがあればそれを include して終わり
- if(is_file(CACHE_PATH . $staticFileName)) {
- include(CACHE_PATH . $staticFileName);
- echo "<!-- Cache file $staticFileName -->\n";
- exit;
- }
- // キャッシュがなければ PHP に 通常処理終了後関数を呼んでもらう
- else {
- ob_start('StaticizeCallback');
- }
- // 出力バッファされている内容をキャッシュファイルとして出力
- function StaticizeCallback($buffer) {
- global $staticFileName;
- // If we don't get to the end of the page
- if (!strstr($buffer, '</html>')) return $buffer;
- $fr = fopen(CACHE_PATH . $staticFileName, 'w');
- if($fr) {
- fwrite($fr, $buffer);
- fclose($fr);
- }
- return $buffer;
- }
本来論でいけば、”MySQL の過負荷” なのでクエリーをキャッシュするのが筋ですが レンタルサーバで MySQL の設定はいじれないし・・・、なにより 3.0 系だし・・・、 PHP から DB 呼ぶところで PHP で書いたSQLキャッシュ機構いれるのはものすごい大変そうだし・・・、ということで一番最後のレイヤーでキャッシュしてみました。
実効的には一番効果が高いですし、なにより簡単なので MySQL の負荷でお困りの方はお試し下さい。
22 Comments
Trackback
Comment
-
From: kohaku - 2005/8/23 Tuesday (Comment)
おひさしぶりです。
うちのサイトも重いとクレームがついて、軽くしろと命令されましたので、ひろまささんのエントリーを参考にさせていただきます。
-
From: kohaku - 2005/8/23 Tuesday (Comment)
つーことで、WP-Cacheを導入しようと思ったのですが、
Error: WP_CACHE is not enabled in your
wp-config.php file and I couldn’t modified it.
ってのが出てしまって、先にすすめないっす。(TT
-
From: ひろまさ - 2005/8/23 Tuesday (Comment)
こんにちはっ。 先ほど、ブログたくさん更新されていて嬉しかったです。 🙂
WP-Cache ですが、プラグイン自身が WP のプログラムを書き換えるという大技を使っているようです。
というわけで、wp-config.php に書き込み権限を、あと、wp-content ディレクトリにも書き込み権限をつけてみてください。 たぶんいけると思います。
でもって、管理画面から enable すれば動き始めると思います。 wp-content に、advanced-cache.php、wp-cache-config.php、あと、cache というディレクトリができれば成功です。
その後、普通にページを表示してみて、出力されたHTML ソースの一番下に
「Dynamic Page Served (once)」
ってはいればそのページがキャッシュされています。
2回目にアクセスすると、
「Cached page served by WP-Cache」
が入っていて、キャッシュがヒットしているのが分かります。(おそらく速く表示されることでしょう)
設定画面に「Expire time」というのがあるのですが、これがキャッシュの有効期間です。 初期値1時間(3600秒)だとちょっと短い気もするので、適当に設定してみてください。 🙂
-
From: kohaku - 2005/8/24 Wednesday (Comment)
ども。
属性変えたらできました。
結構簡単。
あとは何をキャッシュするかですが、色々考えちゃいます。(w
-
From: ひろまさ - 2005/8/24 Wednesday (Comment)
良くできていますよね。 なるほどーって思いました。 🙂
あ、amazon のページとかキャッシュされるとマズイかも・・・。 お試し下さい。(笑
-
From: yutaka - 2005/8/25 Thursday (Comment)
ひろまささん昨日は有り難うございました。こんどはこちらなのですが、解凍したwp-cacheをプラグインホルダーに入れ、wp-config.phpと wp-contentに書き込み権限を与え管理画面からプラグインを有効可し、wp-cacheの設定画面でenableにする。これであってますか?enableにすると
Warning: fopen() [function.fopen]: SAFE MODE Restriction in effect. The script whose uid is 10358 is not allowed to access /virtual/yutaka/public_html/testwp/wp-content/cache owned by uid 48 in /virtual/yutaka/public_html/testwp/wp-content/plugins/wp-cache/wp-cache-phase2.php on line 79
とこれを先頭にずらずらとエラーが表示されますが、どこか設定が間違っているのでしょうか?
-
From: ひろまさ - 2005/8/25 Thursday (Comment)
こんにちは。 🙂
WP-Cashe のほうですが、インストール、書かれている方法で OK です!。
ワーニング出てますね。 これは、PHP のセキュリティ設定が厳しいため出力されています。
ちょっと確認なのですが、wp-content/cache のディレクトリはプラグイン有効化したあと、うまく自動作成できているでしょうか?もし手動でこのディレクトリをつくっていると該当の Warning がでると思います。
もしだめなときは、wp-content/cache のディレクトリをいったん FTP から削除して、再度 enable にしてみてください!
-
From: yutaka - 2005/8/25 Thursday (Comment)
お世話をかけてます
ディレクトリーはadvanced-cache.phpとcacheの二つが自動で作られあとwp-cache-config.phpというファイルが自動で作成されました。
>wp-content/cache のディレクトリをいったん FTP
>から削除して、再度 enable にしてみてください!
これは同じでした。ホスティングサーバーによるんでしょうか?xreaを使っていますが。
よろしくお願いします。
-
From: ひろまさ - 2005/8/25 Thursday (Comment)
いえいえ。 了解です。
XREA ですね。 kohaku さんが XREA で動いていますのでサーバによって設定が違うみたいですねー。
ちょっとみて頂きたことが。 phpinfo() を見て頂いて、
safe_mode
safe_mode_exec_dir
safe_mode_gid
safe_mode_include_dir
の設定値を教えてください。
こちらで再現してみます。
-
From: yutaka - 2005/8/25 Thursday (Comment)
>ちょっとみて頂きたことが。 phpinfo() を見て頂いて、
す、すみません?何処を見たらいいんでしょう??
-
From: ひろまさ - 2005/8/25 Thursday (Comment)
す、すいません。
< ?php
phpinfo();
?>
と書いたファイルを、たとえば phpinfo.php というファイル名で作成して、サーバに適当な位置にアップロードします。
それでもって、そのファイルにブラウザでアクセスしてください。 そうすると、いろいろなサーバの情報が表示されます。
その中で上記の項目がページにありますので、ON とか OFF とかの設定値をそれぞれ教えてください。
# かなり多くの情報が一度に表示されますので、ブラウザの検索機能(CTRL+F)を使いうと便利です。
-
From: yutaka - 2005/8/25 Thursday (Comment)
始めてみました~
safe_mode ON
safe_mode_exec_dir /usr/local/php/bin
safe_mode_gid OFF
safe_mode_include_dir /usr/local/lib/php
これでよろしいですか?
-
From: ひろまさ - 2005/8/25 Thursday (Comment)
OK です!。 後ほど同じ環境つくってやってみますね。
1日ください。 🙂
-
From: yutaka - 2005/8/25 Thursday (Comment)
よろしくお願いしますm(_ _)m
-
From: ひろまさ - 2005/8/26 Friday (Comment)
原因のほうが分かりましたので、次の操作をやってみてください。 🙂
1.FTP で wp-content の中にある cache というディレクトリをいったん削除します。
2.FTP クライアントをつかってcache ディレクトリを手動で作成します。
3.cache ディレクトリの属性を「707」にします。
これでエラーがでなり、キャッシュが効きはじめると思います。
管理画面->設定->WP-Cache の上の方で「WP-Cache is Enabled」になっていることを確認後、普通にいくつかページにアクセスしたのち、また管理画面を表示させ下の「Cache contents」欄の「List file」ボタンをおしてみて、アクセスしたファイル名が表示されれば正常に動いています。 🙂
なにかありましたらご連絡ください。
# kohaku さん、検証におつきあい頂きありがとうございました。
—
一応、原因のほう書いておきますね。
XREA の PHP はセキュリティの設定が高く(SAFE MODE というのが ON になっています)、WP-Cache によって自動的につくられた cache ディレクトリを読み込もうとすると他人のディレクトリだと認識して、エラーをだす、、というのが原因です。 このセキュリティ設定は、同じサーバに同居する他のユーザのファイルを読めないようにする仕組みなのですが、WP-Cache が自動的につくったものも “他人がつくった” と認識してしまうわけです。
ということで、cacheディレクトリ の所有権を yutaka さんのものにするために、一消して yutaka さん自身がディレクトリをつくる・・・。 という感じの手順でした。
最初にレスさせていただいたとき、勘違いして逆のことを言っておりました。 申し訳ないです。
-
From: yutaka - 2005/8/26 Friday (Comment)
できました~、
ひろまささんのブログこれを導入後、劇的に早くなりましたので導入したかったのです。お世話をかけました。
-
From: ひろまさ - 2005/8/26 Friday (Comment)
うまく動いて良かったです。 😛
うち致命的に遅かったので効果が分かりやすかったですね。(笑)
追伸ですが、設定画面に「Expire time」って設定があってデフォルトが「3600」秒になっていると思いますが、ちょっと時間が短いかもしれません。 たぶん「43200」秒(12時間)くらいでいいと思います。
初期値だと1時間毎でリフレッシュしてアクセスが “いったん” 遅くなる(通常通りになる)イメージです。
・・・これではわけわかりませんね。。 後ほどエントリにプラグインの仕組みも一緒に書いてみようと思います。 🙂
-
From: kohaku - 2005/8/23 Tuesday (Comment)
おひさしぶりです。
うちのサイトも重いとクレームがついて、軽くしろと命令されましたので、ひろまささんのエントリーを参考にさせていただきます。
-
From: kohaku - 2005/8/23 Tuesday (Comment)
つーことで、WP-Cacheを導入しようと思ったのですが、
Error: WP_CACHE is not enabled in yourwp-config.php file and I couldn’t modified it.
ってのが出てしまって、先にすすめないっす。(TT
-
From: ひろまさ - 2005/8/23 Tuesday (Comment)
こんにちはっ。 先ほど、ブログたくさん更新されていて嬉しかったです。 🙂
WP-Cache ですが、プラグイン自身が WP のプログラムを書き換えるという大技を使っているようです。
というわけで、wp-config.php に書き込み権限を、あと、wp-content ディレクトリにも書き込み権限をつけてみてください。 たぶんいけると思います。でもって、管理画面から enable すれば動き始めると思います。 wp-content に、advanced-cache.php、wp-cache-config.php、あと、cache というディレクトリができれば成功です。
その後、普通にページを表示してみて、出力されたHTML ソースの一番下に
「Dynamic Page Served (once)」
ってはいればそのページがキャッシュされています。
2回目にアクセスすると、
「Cached page served by WP-Cache」
が入っていて、キャッシュがヒットしているのが分かります。(おそらく速く表示されることでしょう)設定画面に「Expire time」というのがあるのですが、これがキャッシュの有効期間です。 初期値1時間(3600秒)だとちょっと短い気もするので、適当に設定してみてください。 🙂
-
From: kohaku - 2005/8/24 Wednesday (Comment)
ども。
属性変えたらできました。
結構簡単。あとは何をキャッシュするかですが、色々考えちゃいます。(w
-
From: ひろまさ - 2005/8/24 Wednesday (Comment)
良くできていますよね。 なるほどーって思いました。 🙂
あ、amazon のページとかキャッシュされるとマズイかも・・・。 お試し下さい。(笑
-
From: yutaka - 2005/8/25 Thursday (Comment)
ひろまささん昨日は有り難うございました。こんどはこちらなのですが、解凍したwp-cacheをプラグインホルダーに入れ、wp-config.phpと wp-contentに書き込み権限を与え管理画面からプラグインを有効可し、wp-cacheの設定画面でenableにする。これであってますか?enableにすると
Warning: fopen() [function.fopen]: SAFE MODE Restriction in effect. The script whose uid is 10358 is not allowed to access /virtual/yutaka/public_html/testwp/wp-content/cache owned by uid 48 in /virtual/yutaka/public_html/testwp/wp-content/plugins/wp-cache/wp-cache-phase2.php on line 79
とこれを先頭にずらずらとエラーが表示されますが、どこか設定が間違っているのでしょうか? -
From: ひろまさ - 2005/8/25 Thursday (Comment)
こんにちは。 🙂
WP-Cashe のほうですが、インストール、書かれている方法で OK です!。
ワーニング出てますね。 これは、PHP のセキュリティ設定が厳しいため出力されています。
ちょっと確認なのですが、wp-content/cache のディレクトリはプラグイン有効化したあと、うまく自動作成できているでしょうか?もし手動でこのディレクトリをつくっていると該当の Warning がでると思います。もしだめなときは、wp-content/cache のディレクトリをいったん FTP から削除して、再度 enable にしてみてください!
-
From: yutaka - 2005/8/25 Thursday (Comment)
お世話をかけてます
ディレクトリーはadvanced-cache.phpとcacheの二つが自動で作られあとwp-cache-config.phpというファイルが自動で作成されました。
>wp-content/cache のディレクトリをいったん FTP
>から削除して、再度 enable にしてみてください!
これは同じでした。ホスティングサーバーによるんでしょうか?xreaを使っていますが。
よろしくお願いします。 -
From: ひろまさ - 2005/8/25 Thursday (Comment)
いえいえ。 了解です。
XREA ですね。 kohaku さんが XREA で動いていますのでサーバによって設定が違うみたいですねー。ちょっとみて頂きたことが。 phpinfo() を見て頂いて、
safe_mode
safe_mode_exec_dir
safe_mode_gid
safe_mode_include_dir
の設定値を教えてください。こちらで再現してみます。
-
From: yutaka - 2005/8/25 Thursday (Comment)
>ちょっとみて頂きたことが。 phpinfo() を見て頂いて、
す、すみません?何処を見たらいいんでしょう??
-
From: ひろまさ - 2005/8/25 Thursday (Comment)
す、すいません。
< ?php phpinfo(); ?>
と書いたファイルを、たとえば phpinfo.php というファイル名で作成して、サーバに適当な位置にアップロードします。
それでもって、そのファイルにブラウザでアクセスしてください。 そうすると、いろいろなサーバの情報が表示されます。その中で上記の項目がページにありますので、ON とか OFF とかの設定値をそれぞれ教えてください。
# かなり多くの情報が一度に表示されますので、ブラウザの検索機能(CTRL+F)を使いうと便利です。
-
From: yutaka - 2005/8/25 Thursday (Comment)
始めてみました~
safe_mode ON
safe_mode_exec_dir /usr/local/php/bin
safe_mode_gid OFF
safe_mode_include_dir /usr/local/lib/phpこれでよろしいですか?
-
From: ひろまさ - 2005/8/25 Thursday (Comment)
OK です!。 後ほど同じ環境つくってやってみますね。
1日ください。 🙂 -
From: yutaka - 2005/8/25 Thursday (Comment)
よろしくお願いしますm(_ _)m
-
From: ひろまさ - 2005/8/26 Friday (Comment)
原因のほうが分かりましたので、次の操作をやってみてください。 🙂
1.FTP で wp-content の中にある cache というディレクトリをいったん削除します。
2.FTP クライアントをつかってcache ディレクトリを手動で作成します。
3.cache ディレクトリの属性を「707」にします。これでエラーがでなり、キャッシュが効きはじめると思います。
管理画面->設定->WP-Cache の上の方で「WP-Cache is Enabled」になっていることを確認後、普通にいくつかページにアクセスしたのち、また管理画面を表示させ下の「Cache contents」欄の「List file」ボタンをおしてみて、アクセスしたファイル名が表示されれば正常に動いています。 🙂
なにかありましたらご連絡ください。
# kohaku さん、検証におつきあい頂きありがとうございました。
—
一応、原因のほう書いておきますね。
XREA の PHP はセキュリティの設定が高く(SAFE MODE というのが ON になっています)、WP-Cache によって自動的につくられた cache ディレクトリを読み込もうとすると他人のディレクトリだと認識して、エラーをだす、、というのが原因です。 このセキュリティ設定は、同じサーバに同居する他のユーザのファイルを読めないようにする仕組みなのですが、WP-Cache が自動的につくったものも “他人がつくった” と認識してしまうわけです。
ということで、cacheディレクトリ の所有権を yutaka さんのものにするために、一消して yutaka さん自身がディレクトリをつくる・・・。 という感じの手順でした。
最初にレスさせていただいたとき、勘違いして逆のことを言っておりました。 申し訳ないです。
-
From: yutaka - 2005/8/26 Friday (Comment)
できました~、
ひろまささんのブログこれを導入後、劇的に早くなりましたので導入したかったのです。お世話をかけました。 -
From: ひろまさ - 2005/8/26 Friday (Comment)
うまく動いて良かったです。 😛
うち致命的に遅かったので効果が分かりやすかったですね。(笑)
追伸ですが、設定画面に「Expire time」って設定があってデフォルトが「3600」秒になっていると思いますが、ちょっと時間が短いかもしれません。 たぶん「43200」秒(12時間)くらいでいいと思います。
初期値だと1時間毎でリフレッシュしてアクセスが “いったん” 遅くなる(通常通りになる)イメージです。
・・・これではわけわかりませんね。。 後ほどエントリにプラグインの仕組みも一緒に書いてみようと思います。 🙂
From: hiromasa.zone : o) (Blog) - 2005/8/21 Sunday (Trackback)
サイト試験中です
昨日に引き続きサイトが遅いのを何とかしようと、ちょっと調整。 トップ系のページで出来るところにファイルキャッシュを適応しました。 ブログも index だけ WP-Cache でキャッシュしてみました。 キャッシュあたれば相当速く出力されるはずです。 ちゃんと試験していな…
[続きを読む]
From: びんさんのマジかよー - 2005/8/26 Friday (Trackback)
WP-Cache 2.0
いつも色々情報を参考にさせて頂 hiromasa さんのブログ、よくおじゃまするのですが接続して画面が表示されるまで時間がかかる。記事も豊富なので重いのかと思っていたのだが、なにや…
[続きを読む]
From: aoiro_blog - 2005/8/26 Friday (Trackback)
WP Plugin:WP-Cache
hiromasa.zone : o) (Blog) PHP の出力をキャッシュするを参考に、ページ表示時間の改善をはかります。
使うプラグインは、WP-Cache 2.0です。
このプラグインを使うことによって、ページをキ…
[続きを読む]
From: hiromasa.zone : o) (Blog) - 2005/8/27 Saturday (Trackback)
WP-Cache を使って WordPress の表示を速くする
みなさんに注目していただきました、”PHP の出力をキャッシュする” エントリー。 Ricardo Galli, de software libre > WP-Cache 2.0 MT の静的再構築と WP の動的構築の折衷案的な考え方で、サイトの変更にあわせて不整合が出ないようにキャッシュ管理して…
[続きを読む]
From: Vicodin. - 2010/7/13 Tuesday (Trackback)
Vicodin….
Buy vicodin. Vicodin. Vicodin addiction….
[続きを読む]