入力中の回答があります。ページを離れますか?※ページを離れると、回答が消えてしまいますページを離れるA回答を続ける入力中のお礼があります。18:55回答数:5件PHPで、リクエストをまたいで値を保持する方法を教えてください。いうかサーバー起動時に1回処理をし、その情報を使い続ける方法といった方が適切かもしれません。「リクエストをまたいで」といってしまうと、反射的に「セッションに保存」といいたくなると思いますが、そういう話ではありません。画面上に検索条件でSELECTリストを表示します。この情報を今は、画面表示のたびに毎回DBにアクセスしデータを取得しています。サーバーが起動している間程度の期間ではめったに変更することはない値なので、リクエストのたびにDBにとりに行くのがあまりにも無駄なので、これをやめたいと思っています。いって年に何回かは変更があってもおかしくない値なので、そのたびにプログラムを変更するのではなく、あくまでもDBのデータの変更だけで済ませたいと思っています。リクエストのたびにDBにとりに行くのではなく、PHPのプログラムファイルにハードコーディングするのでもなく、Webサーバーが起動したときに1回だけDBから読み込み、変数に保持しておき何度も使いまわしたいと思っています。ためしにclassのstatic変数に値を設定してみたのですが、リクエストのたびに値が初期化されてしまいました。$GLOBALSに値を設定してもリクエストのたびに値が初期化されてしまいました。Javaなどの言語では、当たり前に行う処理ですがPHPで実現する方法が分かりません。PHPで、リクエストをまたいで値を保持する方法を教えてください。するとPHPでは、値を保持することはできないのでしょうか?もしそうだとすると、PHPでは同じ値をDBから何度も取得するケースではどのように対処しているのでしょうか?(DBのキャッシュ機能頼み?そもそもPHPは小規模しか扱わないから気にしない?)この点について教えてください。通報するこの質問への回答は締め切られました。07:58Javaはサーバサードのプログラムは起動しっぱなしなのでstatic変数で保持できますが、PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、処理が終わるとプログラムが終了するので保持ができませんね。(逆にメモリの解放漏れって事は起きないというメリットもありますが)DBからの値をキャッシュする方法としては、memcachedとかRedisを使って値を保持させる方法が多いですかね。私が担当した案件でもmemcachedを使ってキャッシュさせるというのは何度もやってます。ローカルファイルで持つという方法も有りますが、サーバ台数が増えた時各サーバでキャッシュ内容に差異が出たりすると面倒ですが、memcachedを使ってデータを一元管理すれば管理も楽です。そもそもPHPは小規模しか扱わないかなり大規模なサービスでもPHPは普通に使いますよ。この回答への補足>PHPはインタプリタなのでアクセスが有る度にプログラムが起動され、>処理が終わるとプログラムが終了するので保持ができませんね。・Javaはシングルプロセス・マルチスレッド・PHPはマルチプロセスなのですね。PHPはリクエストがあるたびにプロセスを生成するのでコストが高く、DOS攻撃を食らったときもしくは人気が出て大量アクセスがあったときにCPU使用率が上がりやすく、サーバーが死にやすいのではと心配になりました。それはJavaばっかりやっていて、PHPの経験が浅い人の杞憂であり、PHPを普通に使っていれば意外と大丈夫ということなのかもしれませんね。通報するこの回答へのお礼なるほど。PHPは言語としては値を保存する機能はないのですね...。セッション管理はどうしているのか、これもファイル保存なのかと思って調べたら、やはりセッション情報もファイルに保存していました。PHPはそういうものなのですね。言語の基本機能に関する質問のつもりだったので書きませんでしたが、CakePHPを使っています。値);」で値を読み書きできることが分かり、これを使うことにしました。これも仕組みとしては変数(というかキー)ごとにファイルを作成し、そこに値を書き込むという感じでした。memcachedやRedisは別のアプリケーションとしてインストールが必要なのですね。今使おうとしている公開用のサーバーが、無料で使えるもので制約のあるレンタルサーバーだったので、私には敷居が高かったです。ファイルに保存するキャッシュだと、結局ファイルI/Oが発生することになるので、効果が限定的だと思っていたのですが、メモリキャッシュならJava並みのパフォーマンスが期待できそうですね。PHPは言語そのものでは値の保存はできない、ファイル保存する仕組みを利用するか、別途キャッシュ用のアプリケーションをインストールするものだということがはっきりと分かりました。通報するこの回答へのお礼ファイルI/Oが何度も発生するのは気になるのですが、DBにアクセスしまくるよりはいいのでそこはあきらめることにしました。09:29>「セッションに保存」といいたくなると思いますが、そういう話ではありません。いうか、まさにセッションに保存する話じゃないの?この回答への補足セッションだと、同一人物が同一ブラウザで設定されたセッション生存期間の間にアクセスしたときに限定して値を保存する話ですよね。本質問ではそのWebシステムを使う人はいつでも誰でも同じ値を使いまわし続けたい場合という違いがあります。いう違いはありますが、根本的にはPHPの制約で共通の問題を持っているようですね。20:28メモリキャッシュを使うファイルにキャッシュして保存しておく(フォーマットはXMLでもjsonでも好きな方式を利用すればいい)非RDBに保存しておく>そもそもPHPは小規模しか扱わないから気にしない?いや普通にそこそこの大規模案件にも使う。通報するこの回答へのお礼PHPは言語としては値を保存する機能はないのですね。基本的な仕組みとしてはファイルに保存するしかないのですね。ファイルがあるものとしてコーディングする。ファイルを生成するプログラムを記述する。プログラムを実行する。あなたがお望みのことはできるのではないかなぁと思います。通報するこの回答へのお礼ええー、PHPファイルを動的に作成するのですか...。ファイルがない場合のみDBにとりにいってファイルを作成、データが変わった際にファイルを削除する運用にする、とすればまぁ一応実現はできますね...。しなければ実現できない、PHPの標準機能だけでは対処できないということですかね。actionで二つ送信先を指定する方法を教えて下さい。WHERE句内に変数を入れる方法を教えてください。PHP12POSTで受け渡したものを保存したいです。actionで二つ送信先を指定する方法を教えて下さい。WHERE句内に変数を入れる方法を教えてください。PHP12POSTで受け渡したものを保存したいです。【PHP】PHPでそのファイルが格納されているディレクトリ名を変数に代入する方法を教えてください。回答数ランキングです。PHPで・テキスト・ラジオボタン・チェックボックスが複数入り混じった検索システムを作っています。必要な項目を検索し結果画面に映った際に入力したテキスト・ラジオ・チェックボックスの内容が初期化されてしまいます。考えている答えになかなかたどり着けておりませんので、この場を借りて質問の方させていただいた次第でございます。ご存じの方いらっしゃいましたら、是非ともご教授お願い致します。AベストアンサーHTMLとプログラム部分の切り分けをするためにはなるべく単純な構造がよいでしょう私の場合こんな処理をしています。value="go"></form>eof;?>HTMLとプログラム部分の切り分けをするためにはなるべく単純な構造がよいでしょう私の場合こんな処理をしています。$selected["test_d"][$_...続きを読む他の回答も見るQページ移動した場合の、フォームデータの保持PHP初心者です。私が作っているPHPのシステムで、ユーザーがフォームデータ入力途中に、他のページに移動すると、「戻る」ボタンなどですぐに戻ってきても、入力したフォームデータが消えてしまいます。この「教えてgoo」の「新しい質問をする」のフォームはPHPで生成されていますが、http://oshiete1.goo.ne.jp/oshiete_new.php3?c=256途中でちょっと他のページに行っても、(すぐ戻れば?)入力したデータは保持されますよね。」ボタンで戻るとフォームデータが保持されないということではなく、あくまでフォーム入力中に、ちょっと他のページに行って戻ってくるという設定です。原因はセッション関連にありそうですね。session_cache_limiter()というのは指定されていますか?恐らく現状はnocache(ページ内容をキャッシュしない状態)になっているのだと思います。session_cache_limiter('nocache');となっていれば、publicもしくはprivateへ変更してみて下さい。ないようでしたら、session_start()の前にsession_cache_limiter('public');session_cache_limiter('private');のどちらかを記述してみて下さい。publicだと、クライアントマシン、プロキシのどちらもキャッシュを保持しますが、privateだとクライアントマシンのみキャッシュを保持します。どちらが良いのかは使い方によると思いますし、nocacheでないと困る時もありますから。他の部分の処理との関連が分からないので何とも言えないです。一度試してみて下さい。参考URL:http://jp.php.net/session_cache_limiter原因はセッション関連にありそうですね。session_cache_limiter()というのは指定されていますか?恐らく現状はnocache(ページ内容をキャッシュしない状態)になっているのだと思います。session_cache_limiter('nocache');となっていれば、publicもしくはprivateへ変更してみて下さい。ないようでしたら、session_start()の前にsession_cache_limiter('public');session_cache_limiter('private');のどちらかを記述してみて下さい。onClink="<?php~?>">でいけるかと思ったのですが、ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。onClink="window.open(test.php)"という方法以外でお願いします。AベストアンサーAjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありませんAjaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません簡単にサンプルコードで書けるほど単純なものでもありません一般的なサーバーサイドスクリプトの動作として、ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)ですつまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作しますですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。いう動作ならば可能です。Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎませんAjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありませんAjaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません簡単にサンプルコードで書けるほど単純なものでもありません一般的なサーバーサイドスクリプトの動作として、ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)ですつまり、PHP等のサーバーサイドスクリプトは、...続きを読む他の回答も見るQphpソース間で値を保持しておける変数は?aaa.php、bbb.php、ccc.php、・・・・と、複数のソースファイルが存在します。