アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPで、リクエストをまたいで値を保持する方法を教えてください。というかサーバー起動時に1回処理をし、その情報を使い続ける方法といった方が適切かもしれません。「リクエストをまたいで」といってしまうと、反射的に「セッションに保存」といいたくなると思いますが、そういう話ではありません。


画面上に検索条件でSELECTリストを表示します。この情報を今は、画面表示のたびに毎回DBにアクセスしデータを取得しています。

しかしサーバーが起動している間程度の期間ではめったに変更することはない値なので、リクエストのたびにDBにとりに行くのがあまりにも無駄なので、これをやめたいと思っています。かといって年に何回かは変更があってもおかしくない値なので、そのたびにプログラムを変更するのではなく、あくまでもDBのデータの変更だけで済ませたいと思っています。

つまり、リクエストのたびにDBにとりに行くのではなく、PHPのプログラムファイルにハードコーディングするのでもなく、Webサーバーが起動したときに1回だけDBから読み込み、変数に保持しておき何度も使いまわしたいと思っています。


で、ためしにclassのstatic変数に値を設定してみたのですが、リクエストのたびに値が初期化されてしまいました。$GLOBALSに値を設定してもリクエストのたびに値が初期化されてしまいました。

Javaなどの言語では、当たり前に行う処理ですがPHPで実現する方法が分かりません。

PHPで、リクエストをまたいで値を保持する方法を教えてください。
もしかするとPHPでは、値を保持することはできないのでしょうか?
もしそうだとすると、PHPでは同じ値をDBから何度も取得するケースではどのように対処しているのでしょうか?(DBのキャッシュ機能頼み?そもそもPHPは小規模しか扱わないから気にしない?)

この点について教えてください。
よろしくお願いします。

A 回答 (5件)

Javaはサーバサードのプログラムは起動しっぱなしなのでstatic変数で保持できますが、PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、処理が終わるとプログラムが終了するので保持ができませんね。

(逆にメモリの解放漏れって事は起きないというメリットもありますが)

DBからの値をキャッシュする方法としては、memcachedとかRedisを使って値を保持させる方法が多いですかね。
私が担当した案件でもmemcachedを使ってキャッシュさせるというのは何度もやってます。
ローカルファイルで持つという方法も有りますが、サーバ台数が増えた時各サーバでキャッシュ内容に差異が出たりすると面倒ですが、memcachedを使ってデータを一元管理すれば管理も楽です。

> そもそもPHPは小規模しか扱わない
かなり大規模なサービスでもPHPは普通に使いますよ。

この回答への補足

>PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、
>処理が終わるとプログラムが終了するので保持ができませんね。

え、ホントかなと思って調べたのですが、
・Javaはシングルプロセス・マルチスレッド
・PHPはマルチプロセス
なのですね。知りませんでした。

ならば、PHPはリクエストがあるたびにプロセスを生成するのでコストが高く、DOS攻撃を食らったときもしくは人気が出て大量アクセスがあったときにCPU使用率が上がりやすく、サーバーが死にやすいのではと心配になりました。

しかしそれはJavaばっかりやっていて、PHPの経験が浅い人の杞憂であり、PHPを普通に使っていれば意外と大丈夫ということなのかもしれませんね。

補足日時:2014/12/04 15:31
    • good
    • 0
この回答へのお礼

なるほど。PHPは言語としては値を保存する機能はないのですね…。セッション管理はどうしているのか、これもファイル保存なのかと思って調べたら、やはりセッション情報もファイルに保存していました。PHPはそういうものなのですね。

言語の基本機能に関する質問のつもりだったので書きませんでしたが、CakePHPを使っています。また「キャッシュ」のつもりではなかったのでそのワードで検索していなかったのですが、「CakePHP キャッシュ」で検索したところ「Cache::read(キー);」「Cache::write(キー, 値);」で値を読み書きできることが分かり、これを使うことにしました。これも仕組みとしては変数(というかキー)ごとにファイルを作成し、そこに値を書き込むという感じでした。

memcachedやRedisは別のアプリケーションとしてインストールが必要なのですね。今使おうとしている公開用のサーバーが、無料で使えるもので制約のあるレンタルサーバーだったので、私には敷居が高かったです。ファイルに保存するキャッシュだと、結局ファイルI/Oが発生することになるので、効果が限定的だと思っていたのですが、メモリキャッシュならJava並みのパフォーマンスが期待できそうですね。

PHPは言語そのものでは値の保存はできない、ファイル保存する仕組みを利用するか、別途キャッシュ用のアプリケーションをインストールするものだということがはっきりと分かりました。

ありがとうございました

お礼日時:2014/12/04 14:57

なるほどねぇ・・・事情はなんとなくわかりました



DBが更新されるのをトリガーにして
所定のファイルに参照される値を書き込んでおけば
php側でインクルードしたりファイルI/Oしてデータを参照したりすればいい気がします

ただ、結局DBへの接続がないだけでファイルを読み込む作業が発生すれば
「無駄」には変わりないような気もするし微妙ですね
    • good
    • 0
この回答へのお礼

ファイルI/Oが何度も発生するのは気になるのですが、
DBにアクセスしまくるよりはいいのでそこはあきらめることにしました。
ありがとうございました

お礼日時:2014/12/04 23:41

>「セッションに保存」といいたくなると思いますが、そういう話ではありません。



というか、まさにセッションに保存する話じゃないの?

この回答への補足

セッションだと、同一人物が同一ブラウザで設定されたセッション生存期間の間にアクセスしたときに限定して値を保存する話ですよね。本質問ではそのWebシステムを使う人はいつでも誰でも同じ値を使いまわし続けたい場合という違いがあります。

そういう違いはありますが、根本的にはPHPの制約で共通の問題を持っているようですね。

補足日時:2014/12/04 15:18
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2014/12/04 15:00

メモリキャッシュを使う


ファイルにキャッシュして保存しておく
(フォーマットはXMLでもjsonでも好きな方式を利用すればいい)
非RDBに保存しておく

>そもそもPHPは小規模しか扱わないから気にしない?
いや普通にそこそこの大規模案件にも使う。
    • good
    • 0
この回答へのお礼

PHPは言語としては値を保存する機能はないのですね。
基本的な仕組みとしてはファイルに保存するしかないのですね。
ありがとうございました

お礼日時:2014/12/04 14:20

自分も PHP は詳しくない方ですが、PHP は結局インタプリタですから、



1. PHP では問題の情報を格納した変数と、それを記述した PHP ファイルがあるものとしてコーディングする。
2. Web サーバーで実行可能なスクリプト等で、DB にアクセスして 1. のファイルを生成するプログラムを記述する。
3. Web サーバーの起動時(または問題の情報を更新する必要が出てきた時)に 2. のプログラムを実行する。

であなたがお望みのことはできるのではないかなぁと思います。
    • good
    • 0
この回答へのお礼

ええー、PHPファイルを動的に作成するのですか…。
で、ファイルがない場合のみDBにとりにいってファイルを作成、データが変わった際にファイルを削除する運用にする、とすればまぁ一応実現はできますね…。

そうでもしなければ実現できない、PHPの標準機能だけでは対処できないということですかね。

ありがとうございました

お礼日時:2014/12/03 20:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!