PHPで、リクエストをまたいで値を保持する方法を教えてください。というかサーバー起動時に1回処理をし、その情報を使い続ける方法といった方が適切かもしれません。「リクエストをまたいで」といってしまうと、反射的に「セッションに保存」といいたくなると思いますが、そういう話ではありません。
画面上に検索条件でSELECTリストを表示します。この情報を今は、画面表示のたびに毎回DBにアクセスしデータを取得しています。
しかしサーバーが起動している間程度の期間ではめったに変更することはない値なので、リクエストのたびにDBにとりに行くのがあまりにも無駄なので、これをやめたいと思っています。かといって年に何回かは変更があってもおかしくない値なので、そのたびにプログラムを変更するのではなく、あくまでもDBのデータの変更だけで済ませたいと思っています。
つまり、リクエストのたびにDBにとりに行くのではなく、PHPのプログラムファイルにハードコーディングするのでもなく、Webサーバーが起動したときに1回だけDBから読み込み、変数に保持しておき何度も使いまわしたいと思っています。
で、ためしにclassのstatic変数に値を設定してみたのですが、リクエストのたびに値が初期化されてしまいました。$GLOBALSに値を設定してもリクエストのたびに値が初期化されてしまいました。
Javaなどの言語では、当たり前に行う処理ですがPHPで実現する方法が分かりません。
PHPで、リクエストをまたいで値を保持する方法を教えてください。
もしかするとPHPでは、値を保持することはできないのでしょうか?
もしそうだとすると、PHPでは同じ値をDBから何度も取得するケースではどのように対処しているのでしょうか?(DBのキャッシュ機能頼み?そもそもPHPは小規模しか扱わないから気にしない?)
この点について教えてください。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
Javaはサーバサードのプログラムは起動しっぱなしなのでstatic変数で保持できますが、PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、処理が終わるとプログラムが終了するので保持ができませんね。
(逆にメモリの解放漏れって事は起きないというメリットもありますが)DBからの値をキャッシュする方法としては、memcachedとかRedisを使って値を保持させる方法が多いですかね。
私が担当した案件でもmemcachedを使ってキャッシュさせるというのは何度もやってます。
ローカルファイルで持つという方法も有りますが、サーバ台数が増えた時各サーバでキャッシュ内容に差異が出たりすると面倒ですが、memcachedを使ってデータを一元管理すれば管理も楽です。
> そもそもPHPは小規模しか扱わない
かなり大規模なサービスでもPHPは普通に使いますよ。
この回答への補足
>PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、
>処理が終わるとプログラムが終了するので保持ができませんね。
え、ホントかなと思って調べたのですが、
・Javaはシングルプロセス・マルチスレッド
・PHPはマルチプロセス
なのですね。知りませんでした。
ならば、PHPはリクエストがあるたびにプロセスを生成するのでコストが高く、DOS攻撃を食らったときもしくは人気が出て大量アクセスがあったときにCPU使用率が上がりやすく、サーバーが死にやすいのではと心配になりました。
しかしそれはJavaばっかりやっていて、PHPの経験が浅い人の杞憂であり、PHPを普通に使っていれば意外と大丈夫ということなのかもしれませんね。
なるほど。PHPは言語としては値を保存する機能はないのですね…。セッション管理はどうしているのか、これもファイル保存なのかと思って調べたら、やはりセッション情報もファイルに保存していました。PHPはそういうものなのですね。
言語の基本機能に関する質問のつもりだったので書きませんでしたが、CakePHPを使っています。また「キャッシュ」のつもりではなかったのでそのワードで検索していなかったのですが、「CakePHP キャッシュ」で検索したところ「Cache::read(キー);」「Cache::write(キー, 値);」で値を読み書きできることが分かり、これを使うことにしました。これも仕組みとしては変数(というかキー)ごとにファイルを作成し、そこに値を書き込むという感じでした。
memcachedやRedisは別のアプリケーションとしてインストールが必要なのですね。今使おうとしている公開用のサーバーが、無料で使えるもので制約のあるレンタルサーバーだったので、私には敷居が高かったです。ファイルに保存するキャッシュだと、結局ファイルI/Oが発生することになるので、効果が限定的だと思っていたのですが、メモリキャッシュならJava並みのパフォーマンスが期待できそうですね。
PHPは言語そのものでは値の保存はできない、ファイル保存する仕組みを利用するか、別途キャッシュ用のアプリケーションをインストールするものだということがはっきりと分かりました。
ありがとうございました
No.4
- 回答日時:
>「セッションに保存」といいたくなると思いますが、そういう話ではありません。
というか、まさにセッションに保存する話じゃないの?
この回答への補足
セッションだと、同一人物が同一ブラウザで設定されたセッション生存期間の間にアクセスしたときに限定して値を保存する話ですよね。本質問ではそのWebシステムを使う人はいつでも誰でも同じ値を使いまわし続けたい場合という違いがあります。
そういう違いはありますが、根本的にはPHPの制約で共通の問題を持っているようですね。
No.1
- 回答日時:
自分も PHP は詳しくない方ですが、PHP は結局インタプリタですから、
1. PHP では問題の情報を格納した変数と、それを記述した PHP ファイルがあるものとしてコーディングする。
2. Web サーバーで実行可能なスクリプト等で、DB にアクセスして 1. のファイルを生成するプログラムを記述する。
3. Web サーバーの起動時(または問題の情報を更新する必要が出てきた時)に 2. のプログラムを実行する。
であなたがお望みのことはできるのではないかなぁと思います。
ええー、PHPファイルを動的に作成するのですか…。
で、ファイルがない場合のみDBにとりにいってファイルを作成、データが変わった際にファイルを削除する運用にする、とすればまぁ一応実現はできますね…。
そうでもしなければ実現できない、PHPの標準機能だけでは対処できないということですかね。
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- PHP PHP ページング データベース 1 2022/06/16 10:30
- IT・エンジニアリング ドメイン駆動設計の値オブジェクトについて質問 1 2023/05/13 02:50
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTMLエスケープ処理とデーター...
-
VBAで重複チェックの仕方を教え...
-
ログイン後の処理
-
POSTで受け渡したものを保存し...
-
バッチファイルでpingの結果を...
-
Dosブロンプトでtabを出力したい
-
「取得先」という表現について
-
【C#】DataGridViewの最大列数...
-
Yahoo! JAPAN IDを新規取得でき...
-
DTOとEntityの差は何ですか。
-
switch()文で値の大小比較
-
wordの差し込み印刷で文字...
-
ps3で久しぶりにCDの音楽情報取...
-
エラーの理由が分りません。Pri...
-
shシェルスクリプト 空白行の...
-
EXCEL、マクロ-改ページ行番号...
-
開始と終了を指定して、その間...
-
Google scholarがひらけなくな...
-
format関数について
-
グローバルIPの取得方法を教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
POSTで受け渡したものを保存し...
-
ログイン画面から入って、「戻...
-
ブラウザバックしてもチェック...
-
php 入力画面から確認表示画面...
-
HTMLフォームのデータ引き継ぎ...
-
VBAで重複チェックの仕方を教え...
-
php history.back()の戻るボタ...
-
セッション使用時のフォームの...
-
HTMLエスケープすべき場所につ...
-
PHPで返信メールにチェックボッ...
-
閉じるボタン「×」を制御したい
-
HTMLエスケープ処理とデーター...
-
携帯サイトにお気に入りに登録...
-
ウェブアプリの設計に問題がな...
-
セッションを使用したページ遷移
-
入力系のプログラミング手法に...
-
GETとPOST
-
asp.netでのセッションを使用し...
-
フォームを使わずにPOST送信す...
-
PHPでのログイン機能でのメール...
おすすめ情報