- ベストアンサー
PHPで値を保持する方法
- PHPでリクエストをまたいで値を保持する方法について教えてください。リクエストごとにDBにアクセスするのは無駄ですので、サーバー起動時に1回だけDBから読み込んで変数に保持したいです。
- PHPでリクエストをまたいで値を保持する方法について教えてください。リクエストごとにDBにアクセスするのは効率が悪いため、サーバー起動時に1回だけDBから読み込んで変数に保持する方法を知りたいです。
- PHPでリクエストをまたいで値を保持する方法について教えてください。リクエストごとにDBにアクセスするのは冗長なので、サーバー起動時に1回だけDBから読み込んで変数に保持する方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Javaはサーバサードのプログラムは起動しっぱなしなのでstatic変数で保持できますが、PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、処理が終わるとプログラムが終了するので保持ができませんね。(逆にメモリの解放漏れって事は起きないというメリットもありますが) DBからの値をキャッシュする方法としては、memcachedとかRedisを使って値を保持させる方法が多いですかね。 私が担当した案件でもmemcachedを使ってキャッシュさせるというのは何度もやってます。 ローカルファイルで持つという方法も有りますが、サーバ台数が増えた時各サーバでキャッシュ内容に差異が出たりすると面倒ですが、memcachedを使ってデータを一元管理すれば管理も楽です。 > そもそもPHPは小規模しか扱わない かなり大規模なサービスでもPHPは普通に使いますよ。
その他の回答 (4)
- yambejp
- ベストアンサー率51% (3827/7415)
なるほどねぇ・・・事情はなんとなくわかりました DBが更新されるのをトリガーにして 所定のファイルに参照される値を書き込んでおけば php側でインクルードしたりファイルI/Oしてデータを参照したりすればいい気がします ただ、結局DBへの接続がないだけでファイルを読み込む作業が発生すれば 「無駄」には変わりないような気もするし微妙ですね
お礼
ファイルI/Oが何度も発生するのは気になるのですが、 DBにアクセスしまくるよりはいいのでそこはあきらめることにしました。 ありがとうございました
- yambejp
- ベストアンサー率51% (3827/7415)
>「セッションに保存」といいたくなると思いますが、そういう話ではありません。 というか、まさにセッションに保存する話じゃないの?
お礼
ありがとうございました
補足
セッションだと、同一人物が同一ブラウザで設定されたセッション生存期間の間にアクセスしたときに限定して値を保存する話ですよね。本質問ではそのWebシステムを使う人はいつでも誰でも同じ値を使いまわし続けたい場合という違いがあります。 そういう違いはありますが、根本的にはPHPの制約で共通の問題を持っているようですね。
- krokrokro123
- ベストアンサー率13% (3/23)
メモリキャッシュを使う ファイルにキャッシュして保存しておく (フォーマットはXMLでもjsonでも好きな方式を利用すればいい) 非RDBに保存しておく >そもそもPHPは小規模しか扱わないから気にしない? いや普通にそこそこの大規模案件にも使う。
お礼
PHPは言語としては値を保存する機能はないのですね。 基本的な仕組みとしてはファイルに保存するしかないのですね。 ありがとうございました
- hitomura
- ベストアンサー率48% (325/664)
自分も PHP は詳しくない方ですが、PHP は結局インタプリタですから、 1. PHP では問題の情報を格納した変数と、それを記述した PHP ファイルがあるものとしてコーディングする。 2. Web サーバーで実行可能なスクリプト等で、DB にアクセスして 1. のファイルを生成するプログラムを記述する。 3. Web サーバーの起動時(または問題の情報を更新する必要が出てきた時)に 2. のプログラムを実行する。 であなたがお望みのことはできるのではないかなぁと思います。
お礼
ええー、PHPファイルを動的に作成するのですか…。 で、ファイルがない場合のみDBにとりにいってファイルを作成、データが変わった際にファイルを削除する運用にする、とすればまぁ一応実現はできますね…。 そうでもしなければ実現できない、PHPの標準機能だけでは対処できないということですかね。 ありがとうございました
お礼
なるほど。PHPは言語としては値を保存する機能はないのですね…。セッション管理はどうしているのか、これもファイル保存なのかと思って調べたら、やはりセッション情報もファイルに保存していました。PHPはそういうものなのですね。 言語の基本機能に関する質問のつもりだったので書きませんでしたが、CakePHPを使っています。また「キャッシュ」のつもりではなかったのでそのワードで検索していなかったのですが、「CakePHP キャッシュ」で検索したところ「Cache::read(キー);」「Cache::write(キー, 値);」で値を読み書きできることが分かり、これを使うことにしました。これも仕組みとしては変数(というかキー)ごとにファイルを作成し、そこに値を書き込むという感じでした。 memcachedやRedisは別のアプリケーションとしてインストールが必要なのですね。今使おうとしている公開用のサーバーが、無料で使えるもので制約のあるレンタルサーバーだったので、私には敷居が高かったです。ファイルに保存するキャッシュだと、結局ファイルI/Oが発生することになるので、効果が限定的だと思っていたのですが、メモリキャッシュならJava並みのパフォーマンスが期待できそうですね。 PHPは言語そのものでは値の保存はできない、ファイル保存する仕組みを利用するか、別途キャッシュ用のアプリケーションをインストールするものだということがはっきりと分かりました。 ありがとうございました
補足
>PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、 >処理が終わるとプログラムが終了するので保持ができませんね。 え、ホントかなと思って調べたのですが、 ・Javaはシングルプロセス・マルチスレッド ・PHPはマルチプロセス なのですね。知りませんでした。 ならば、PHPはリクエストがあるたびにプロセスを生成するのでコストが高く、DOS攻撃を食らったときもしくは人気が出て大量アクセスがあったときにCPU使用率が上がりやすく、サーバーが死にやすいのではと心配になりました。 しかしそれはJavaばっかりやっていて、PHPの経験が浅い人の杞憂であり、PHPを普通に使っていれば意外と大丈夫ということなのかもしれませんね。