PHP


現在MySQLとPHPをりようしたフォーラムを運営しているのですが、毎回アクセスのたびにSQLが数個実行され負荷がかかってしまっています。

以前質問したら memcached があるということがわかったのですが、いまいち仕組みがわかりません。そこで質問です。

そのようにインストールし、今現在あるスクリプトをどのように改造すればいいのでしょうか?

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/05/03 14:19:22
  • 終了:2007/05/10 14:20:03

回答(2件)

id:studioes No.1

studioes回答回数522ベストアンサー獲得回数612007/05/04 10:54:36

ポイント35pt

>1、ダウンロードしたmemcacheを~

バイナリを拾ってきたなら、適切なディレクトにコピーして、php.iniでエクステンションを有効化して、Webサービスを再起動。

>2、このmemcacheですが、~

しません。 更新する仕組みを自分で組む必要があります(更新処理時に、memcache::delete()を実行する等)

>3、memcahced(http://www.danga.com/memcached/)も~

PHPのmemcacheは、memcachedへ接続する為の中間システムに過ぎませんので、memcachedを導入しなければなりません。

>4、今ある~

あります。

>5、APCなど~

APCが何かわかりません。 UPSしか思いつかん・・・

・インストール

http://tokita.info/modules/wordpress/index.php?cat=21

デーモンとPHPエクステンションの組み込みが必要なので共有レンタルサーバ等で管理権限がなければ利用できない。

・改造

 リアルタイムに更新される必要がないクエリの結果などをmemcachedに入れておいて、memchachedにデータがある間は新規のクエリ発行をせずに、memcachedからデータを取ってくるようにする。

 例えば、全員に表示するお知らせ情報をDBに入れているなら、それの選択結果をaddしておいて、get出来る間はgetで済ませる。 get()==falseになれば、クエリを発行して再度addしておく。 また、お知らせ情報を更新するページでは、更新時にdelete()を実行して削除しておく。

id:esecua

回答ありがとうございます。

>php.iniでエクステンションを有効化して..

?です。意味はわかるのですが、それをどのように記述すればいいのかその説明ではまったくわかりません。


改造の件ですが、いまいち文字での説明ではいまいち理解できないです。

ちなみにAPCとはPECLのAPCパッケージのことです。

2007/05/04 13:19:28
id:studioes No.2

studioes回答回数522ベストアンサー獲得回数612007/05/04 14:08:37

ポイント35pt

・エクステンションの有効化

http://shiro.exbridge.info/archives/50980652.html

php.iniで

extension=php_memcache.dll

を追記。

 変更を適用するにはWebサービス(Apache等)を再起動。

・APCもmemcacheも同じような物。 APCはローカルのメモリにキャッシュするのに対して、memcacheはmemcachedサーバにキャッシュするから、キャッシュだけ別のサーバにしたりも出来る。

・例

$mc = new Memcache;

$mc->connect('memcache_host', 11211);

if($oshirase = $mc->get('oshirase')){

}else{

~DBから$oshiraseに情報を拾ってくる~

$mc->set('oshirase', $oshirase, MEMCACHE_COMPRESSED, 60);

}

echo($oshirase);

 memcachedにoshiraseが生存している間(最終DB問い合わせから60秒)、memcachedからお知らせを取得し、存在しなければ従来通りDBから取って来る。 また、DBから取ってきたときにはmemcachedに入れておく。 これで、DBへのアクセスは更新がない状態では60秒に1回で済む。

insert into oshirase values~の様な処理を行う段階で、

$mc->delete('oshirase');の様にして、memcachedのoshiraseを削除しておけば、$mc->get('oshirase')の戻り値がfalseになるので、DBから取得される。

id:esecua

ありがとうございます。

2007/05/04 16:31:47
  • id:b-wind
    とりあえずマニュアルは読まれたんですかね。
    http://jp.php.net/memcache
    読まれたのであればどの辺りが分からないか教えてください。
  • id:esecua
    コメントありがとうございます。

    1、ダウンロードしたmemcacheをWindows、FreeBSDにどのようにインストールすればいいのでしょうか?FreeBSDはpecl install memcache でいいのでしょうか?Windowsはどのようにすればいいのでしょうか?

    2、このmemcacheですが、キャッシュということでDBに入っているデータがきちんと表示されるのでしょうか?例えば10秒前にキャッシュされた掲示板のデータがあります。その3秒後新たなデータが掲示板のDBに格納された場合、しっかりとキャッシュを更新してくれるのでしょうか?

    3、memcahced(http://www.danga.com/memcached/)もインストールしなければならないのでしょうか?

    4、今あるスクリプトを改造する必要はあるのでしょうか?

    5、APCなどとはまったくの別物と考えていいのでしょうか?

    よろしくお願いします。
  • id:esecua
    以前ThinkITの伊藤CTOの記事を見ましたが、はてなのサービスでもmemcachedを使用しているとの事でした。

    しかし回答1のを見てみると動的のDBのデータは反映されず、あくまでも一定時間変わらないデータ定期的にDBから抜き出し、それをメモリ上に保存し、出力していると認識しました。(間違っていたらすいません。)

    そうなるとやはりはてなでも例えばコンピュータ欄の人力検索を見ることで毎回SQLが実行され、即座に最新のデータを表示していることになるのでしょうか?もしこれがmemcaheでキャッシュされ、極力SQLを実行していないのであれば、今アクセスしても2秒前に投稿された質問が表示されないことになります。はてなブックマークでも同じことではないでしょうか?各ユーザーのブックマークをmemcaheでキャッシュし、表示しているのであれば例えばID:naoyaを表示したさい、2秒前にブックマークしたサイトは表示されないということなのでしょうか?

    そう考えるとほとんどのデータ表示にSQLを実行しなければならず、ThinkITの記事であったmemcaheを利用には食い違いがあります。(おおよそ動的ではないデータの表示にmemcaheを利用している?)

    初心者的な質問になりますが、どうかよろしくお願いします。

  • id:b-wind
    >はてなでも例えばコンピュータ欄の人力検索を見ることで
    > 中略
    >今アクセスしても2秒前に投稿された質問が表示されないことになります。
    おそらく YES です。
    実際自分は何度もそういう事態に遭遇しています。(他の理由もからんでいるでしょうけど)

    キャッシュはあくまでキャッシュ。
    静的なデータに使うのが一番効率がよく、更新頻度の低いデータなら負荷が現象するメリットが大きいのでリアルタイム性を犠牲にしてでも導入するメリットがある。
    はてなで言うと人力検索の質問部分やはてなブックマークの要約部分は導入価値が大きいと思える。

    逆に完全にダイナミックなデータならデメリットのほうが大きいので使用しづらい。
    たとえばはてななら、「はてなポイント」のデータはリアルタイムで無いと困った事になるので自分ならキャッシュは使わない。
    (実際どうしているかは知らないけど)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません