PHPで値を保持する方法

このQ&Aのポイント
  • PHPでリクエストをまたいで値を保持する方法について教えてください。リクエストごとにDBにアクセスするのは無駄ですので、サーバー起動時に1回だけDBから読み込んで変数に保持したいです。
  • PHPでリクエストをまたいで値を保持する方法について教えてください。リクエストごとにDBにアクセスするのは効率が悪いため、サーバー起動時に1回だけDBから読み込んで変数に保持する方法を知りたいです。
  • PHPでリクエストをまたいで値を保持する方法について教えてください。リクエストごとにDBにアクセスするのは冗長なので、サーバー起動時に1回だけDBから読み込んで変数に保持する方法を教えてください。
回答を見る
  • ベストアンサー

PHPで値を保持する方法

PHPで、リクエストをまたいで値を保持する方法を教えてください。というかサーバー起動時に1回処理をし、その情報を使い続ける方法といった方が適切かもしれません。「リクエストをまたいで」といってしまうと、反射的に「セッションに保存」といいたくなると思いますが、そういう話ではありません。 画面上に検索条件でSELECTリストを表示します。この情報を今は、画面表示のたびに毎回DBにアクセスしデータを取得しています。 しかしサーバーが起動している間程度の期間ではめったに変更することはない値なので、リクエストのたびにDBにとりに行くのがあまりにも無駄なので、これをやめたいと思っています。かといって年に何回かは変更があってもおかしくない値なので、そのたびにプログラムを変更するのではなく、あくまでもDBのデータの変更だけで済ませたいと思っています。 つまり、リクエストのたびにDBにとりに行くのではなく、PHPのプログラムファイルにハードコーディングするのでもなく、Webサーバーが起動したときに1回だけDBから読み込み、変数に保持しておき何度も使いまわしたいと思っています。 で、ためしにclassのstatic変数に値を設定してみたのですが、リクエストのたびに値が初期化されてしまいました。$GLOBALSに値を設定してもリクエストのたびに値が初期化されてしまいました。 Javaなどの言語では、当たり前に行う処理ですがPHPで実現する方法が分かりません。 PHPで、リクエストをまたいで値を保持する方法を教えてください。 もしかするとPHPでは、値を保持することはできないのでしょうか? もしそうだとすると、PHPでは同じ値をDBから何度も取得するケースではどのように対処しているのでしょうか?(DBのキャッシュ機能頼み?そもそもPHPは小規模しか扱わないから気にしない?) この点について教えてください。 よろしくお願いします。

  • PHP
  • 回答数5
  • ありがとう数13

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5068/13243)
回答No.3

Javaはサーバサードのプログラムは起動しっぱなしなのでstatic変数で保持できますが、PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、処理が終わるとプログラムが終了するので保持ができませんね。(逆にメモリの解放漏れって事は起きないというメリットもありますが) DBからの値をキャッシュする方法としては、memcachedとかRedisを使って値を保持させる方法が多いですかね。 私が担当した案件でもmemcachedを使ってキャッシュさせるというのは何度もやってます。 ローカルファイルで持つという方法も有りますが、サーバ台数が増えた時各サーバでキャッシュ内容に差異が出たりすると面倒ですが、memcachedを使ってデータを一元管理すれば管理も楽です。 > そもそもPHPは小規模しか扱わない かなり大規模なサービスでもPHPは普通に使いますよ。

pringlez
質問者

お礼

なるほど。PHPは言語としては値を保存する機能はないのですね…。セッション管理はどうしているのか、これもファイル保存なのかと思って調べたら、やはりセッション情報もファイルに保存していました。PHPはそういうものなのですね。 言語の基本機能に関する質問のつもりだったので書きませんでしたが、CakePHPを使っています。また「キャッシュ」のつもりではなかったのでそのワードで検索していなかったのですが、「CakePHP キャッシュ」で検索したところ「Cache::read(キー);」「Cache::write(キー, 値);」で値を読み書きできることが分かり、これを使うことにしました。これも仕組みとしては変数(というかキー)ごとにファイルを作成し、そこに値を書き込むという感じでした。 memcachedやRedisは別のアプリケーションとしてインストールが必要なのですね。今使おうとしている公開用のサーバーが、無料で使えるもので制約のあるレンタルサーバーだったので、私には敷居が高かったです。ファイルに保存するキャッシュだと、結局ファイルI/Oが発生することになるので、効果が限定的だと思っていたのですが、メモリキャッシュならJava並みのパフォーマンスが期待できそうですね。 PHPは言語そのものでは値の保存はできない、ファイル保存する仕組みを利用するか、別途キャッシュ用のアプリケーションをインストールするものだということがはっきりと分かりました。 ありがとうございました

pringlez
質問者

補足

>PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、 >処理が終わるとプログラムが終了するので保持ができませんね。 え、ホントかなと思って調べたのですが、 ・Javaはシングルプロセス・マルチスレッド ・PHPはマルチプロセス なのですね。知りませんでした。 ならば、PHPはリクエストがあるたびにプロセスを生成するのでコストが高く、DOS攻撃を食らったときもしくは人気が出て大量アクセスがあったときにCPU使用率が上がりやすく、サーバーが死にやすいのではと心配になりました。 しかしそれはJavaばっかりやっていて、PHPの経験が浅い人の杞憂であり、PHPを普通に使っていれば意外と大丈夫ということなのかもしれませんね。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

なるほどねぇ・・・事情はなんとなくわかりました DBが更新されるのをトリガーにして 所定のファイルに参照される値を書き込んでおけば php側でインクルードしたりファイルI/Oしてデータを参照したりすればいい気がします ただ、結局DBへの接続がないだけでファイルを読み込む作業が発生すれば 「無駄」には変わりないような気もするし微妙ですね

pringlez
質問者

お礼

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

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

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

pringlez
質問者

お礼

ありがとうございました

pringlez
質問者

補足

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

回答No.2

メモリキャッシュを使う ファイルにキャッシュして保存しておく (フォーマットはXMLでもjsonでも好きな方式を利用すればいい) 非RDBに保存しておく >そもそもPHPは小規模しか扱わないから気にしない? いや普通にそこそこの大規模案件にも使う。

pringlez
質問者

お礼

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

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

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

pringlez
質問者

お礼

ええー、PHPファイルを動的に作成するのですか…。 で、ファイルがない場合のみDBにとりにいってファイルを作成、データが変わった際にファイルを削除する運用にする、とすればまぁ一応実現はできますね…。 そうでもしなければ実現できない、PHPの標準機能だけでは対処できないということですかね。 ありがとうございました

関連するQ&A

  • phpソース間で値を保持しておける変数は?

    aaa.php、bbb.php、ccc.php、・・・・ と、複数のソースファイルが存在します。 その間で、共通に値を保持でき、また、どのソース内でも代入で入れ替えることができる変数ってありますか? global変数って、同phpファイル内で、function間での保持のみですよね? ちなみに、使用しているPHP Versionは 4.4.2です。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • php + javascriptで値の保持

    現在、ラジオボタンによるデータの受け渡しを調べているのですが submitボタンを使わずに、データ遷移がしたいと思い 色々やっているのですが上手く行きません。 これは実現可能なのでしょうか? <input type="radio" name="hoge" value="1" onclick="location.href='<?php echo $_SERVER['REQUEST_URI']; ?>'; test(this.value);" <?php echo $check1; ?>> <input type="radio" name="hoge" value="2" onclick="location.href='<?php echo $_SERVER['REQUEST_URI']; ?>'; test(this.value);" <?php echo $check2; ?>> <input type="radio" name="hoge" value="3" onclick="location.href='<?php echo $_SERVER['REQUEST_URI']; ?>'; test(this.value);" <?php echo $check3; ?>> 上記のソースの様な感じでとりあえずやってみましたが、 「ボタンを押したら即移動」は可能なものの、value値の保持が javascript上でどうやったらいいか分かりません。 ※$check1~3は遷移後のchcked判定の変数です ※test関数においてのvalueを格納する処理が分かりません やはり無難にsubmitボタン+セッション関数等で構築した方が良いのでしょうか?

    • ベストアンサー
    • PHP
  • ページ移動での値の保持

    PHPカテゴリなら 詳しい方がおられるかな?と思い、質問です。 ブラウザ(フォームとか)から入力した値を 画面を何度切り替えても保持していく方法について、 ふと疑問に思ったことです。 <input type="hidden" name="a" value="<?= $_POST['a'] ?>"> のように仕組んでおくと、前のページからの a の値を次のページに渡せますよね。 この方法と、セッションを使う方法の、どちらがよいやり方でしょう? 1)サーバーとブラウザで キャッチボール式に値を投げっこして保持していくのと、 2)セッションに登録してしまって、サーバーで保持するのと、 どちらがどういいのか気になりました。 もちろん、パスワードの類は前者(1)をやるとよろしくないと思いますが、サーバーの負荷具合とか、速さとか、プログラミング上のこととか、良いところ悪いところを、どうか教えてください。 専門家の意見、個人的な意見、好み、理屈の通った意見、いろいろ待ってます。

    • 締切済み
    • PHP
  • 値の保持

    図書管理システムをPHPで作っております。 本の検索結果をページングで2件ずつなどで表示しております。 そこで、貸出可能の場合チェックボックスを表示し、 1ページ目でいくつかチェックし、 次ページの検索結果に行き、またチェックボックスを チェックし、最終的には前にチェックした値と合わせて 一括貸出処理を行いたいと思っております。 セッションを使ったり、 <a href=test.php?page=1&value=値1,値2・・・など>で チェックした値を保持しようと思い、検索してみたのですが いいのが見つかりませんでした。 具体的な方法があれば教えてください。 初心者のため、文章に分かりづらい点や意味不明な部分 があるかと思いますが 何卒宜しくお願い致します。 スタイルですが、 submitボタンは 貸出ボタンしか使用しないため、 チェックボックスの値をチェックした時点で 値を取得でき、それを保持したまま次ページで もチェックした値を加えていければと思います。

    • ベストアンサー
    • PHP
  • IEとFirefoxでPHPから値を受け取るときの挙動が違う

    現在ActionScript3.0からPHPに対してPOSTし、対象PHP内でデータベースの値を変更し、そのPHPから変数形式での返り値を受け取る処理を実装しているのですが、IEとFirefoxで挙動の違う場合がありわけがわからなくなっております。以下は現象の流れです。 1.Flash(ActionScript3.0)からDB更新用PHPをロード(loadURL) 2.データベース自体は正常に処理される 3.Flashから更新したデータを取得するPHPをロード。返り値は変数形式 例:echo "var0=name&var1=2"; 4.Firefoxでは更新後のデータが取得でき、IEでは出来ないケースがある。ページ自体をリロードした直後にデータベースの値をPHPで取得すると、IEでも正常に取得できる。 ■環境 Apache2.2.11 PHP5.3.0 PostgreSQL 8.4 OS:Vista/CentOS5.3

    • 締切済み
    • PHP
  • JavaScriptの値をPHPで取得

    こんにちわ。よろしくお願いします。 いま、JavaScriptで取得した値を同一ページ内でPHPの変数に入れることはできないでしょうか? 例えば <SCRIPT language="JavaScript"> <!-- document.write(document.referrer); // --> </SCRIPT> というのがあったとして これの値をPHPの変数に入れることができればなぁっと考えています。 自分的にには無理っぽいかなって思っているのですが、 もしかしたらなにか方法があるかもしれないと思い 質問させていただきました。 なにか方法がわかる方がいらっしゃいましたらアドバイスお願いします。

    • ベストアンサー
    • PHP
  • 「戻る」ボタンで値の保持

    PHPやCGIなどで同じファイルにデータをポストした後に、ブラウザの「戻る」ボタンで戻ったときに「ページの有効期限切れ」になってしまうのですが、回避する方法はないでしょうか。 元のページとフィールドに入れた値を保持することはできないでしょうか。 他のファイルからポストしない限り値の保持は難しいのでしょうか。

    • 締切済み
    • PHP
  • GETを使ったファイル間の値渡し

    現在、PHP・MySQLを使用した開発を行っております。 早速、質問に入りますが・・・まずは概要として以下のような使用となっております。 ・index.htmlからリンク時に、A.phpに飛びDBへアクセスし表示すべきURL(top.html)を取得します ・表示されたURL(top.html)には、5つのリンクがあるのですが5つのリンク先URLは、A.php処理中にDBにて取得した5つのパラメータ値としています。 つまり、top.html内に変数値として値を保持させておきたいのです。 sessionを使うという話しもあったのですが、諸事情により現在はGET関数を思考しております。 以上が概要です。 質問は、A.phpにて取得した5つの値をtop.htmlに渡すにはどのようなコーディングを行えば良いのでしょうか? PHP初心者のため苦戦しております。 何かアドバイスをお願いできれば幸いです。

    • ベストアンサー
    • PHP
  • 変数に保持している値はどうやったら確認できるの?

    Publicで宣言した変数はブックを閉じるまで値を保持すると言うけど、 その保持している値はどうやったら確認できるのですか? 例えば標準モジュールに ++++++++++++++++++++++++++++++ Option Explicit Public a As String Sub test() a = "こんにちは" End Sub ++++++++++++++++++++++++++++++ とした場合、 1回testを実行すると、a には "こんにちは"が入りますよね。 この時例えばトイレに行って、パソコンの前に戻ってきたときに、 「aに何の値がはいってたっけ?」ってどうやって確認すればいいのでしょうか? testを実行する前に、ウォッチ式にaを登録しましたが、 testを実行し終わるとaの値は「対象範囲外」になっています。 でもこの状態でもaの値は保持されてるのですよね? 発見したのは、testをF8でステップインをすると、 2行目のa = "こんにちは"を通過する前に、aにすでに値が入ってる事がわかりました。 こういう方法で確認するしかないのでしょうか?

  • メールフォームの値保持

    メールフォームを作成しているのですが、値をセッションにて保持したいのですが上手くできません。 考え方が誤っているような気がするので、指摘いただけないでしょうか。どうかよろしくお願いします。 以下のような3画面移動で、値を保持したいのです。 入力==================================================================== <html><head><title>入力</title></head> <body> <form action="confirm.php" method="post"> 魚は好きですか?<BR> はい<input type="radio" name="fish" value="yes"><BR> いいえ<input type="radio" name="fish" value="no"><BR><BR> <input type="submit" value="送信"> </body> </html> 確認==================================================================== <?php session_start(); $fish = $_POST["fish"]; $_SESSION["fish"] = $fish; ?> <html><head><title>テスト確認画面</title></head> <body> <?php print("変数fishの値は".$_SESSION["fish"]."です。"); ?> <form action="output.php" method="post"> <input type="submit" value="次ページへ値を渡す"> </body> </html> 完了==================================================================== <?php session_start(); ?> <html> <head><title>テスト完了画面</title></head> <body> <?php print("変数fishの値は".$fish."です。"); ?> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう