session_set_save_handler の実装について

このQ&Aのポイント
  • セッション管理を session_set_save_handler を使って実装している際に、正常に動作しない現象が発生しました。
  • session_set_save_handler を定義すると、$_SESSION変数に値を書き込む際に問題が発生しましたが、session_start()やsession_write_close()を使用する場合には正常に動作しました。
  • この現象はsession_set_save_handlerのバグか、仕様によるものかを知りたいです。
回答を見る
  • ベストアンサー

session_set_save_handler の実装について

いつもお世話になります。 セッション管理を session_set_save_handler を使って実装を進めていたのですが、 session_set_save_handler を使わない場合、 -------------------------------------- session_ start(); $_SESSION('a') = 'teststring_a'; session_ write_ close(); session_ start(); $_SESSION('b') = 'teststring_b'; session_ write_ close(); -------------------------------------- のように書いても問題なく $_SESSION('a') $_SESSION('b') 共に正常に書き込めていました。 ところが、 session_set_save_handler を定義した途端、 動かなくなってしまいました。 -------------------------------------- session_ start(); $_SESSION('a') = 'teststring_a'; session_ write_ close(); -------------------------------------- では正常に動作していました。 -------------------------------------- session_ start(); $_SESSION('a') = 'teststring_a'; session_ start(); session_ write_ close(); -------------------------------------- でも正常でした。 これは session_set_save_handler のバグか、仕様なのでしょうか? 以上です。 わかる方いましたら、よろしくご教授お願いしますm( __ __ )m

  • PHP
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答No.1

session_write_closeを行った後に、 再度session_set_save_handlerを叩く必要があるようです。 一度、error_reportingや、error_displayを表示するように設定してみていただくと、 二回目のsession_start時点で、エラーが発生しているのがわかります。 どうも、sessionをクローズするタイミングで自身で設定したハンドラも初期化されてしまうようです。

conecoxxx
質問者

お礼

回答ありがとうございます! 早速 session_set_save_handler の仕様を確認して試してみたところバッチリ理想の動きを示しました。 思わぬところでハマッってしまい助かりました^^ ありがとうございました('◇')ゞ

関連するQ&A

  • session_set_save_handler と session_regenerate_id は同時に使えない?

    session_set_save_handlerを利用してセッションデータをDBに格納しているのですが、session_regenerate_idを使用するとIDが毎回変わるため、session_set_save_handler での UPDATEやDELETEなどが出来なくなってしまいます。 DELETE FROM session WHERE sid = ".session_id()."の為。 どのようにすれば両方同時に使用できるのでしょうか?

    • ベストアンサー
    • PHP
  • セッション情報をDBに持つには

    下記のサイトを見つけ、参考にしようと思いましたが... http://www.res-system.com/weblog/item/619 行った事は下記の通りです。 1.セッション情報を格納するテーブルを作成。 2.php.iniの変更。 聞きたい事は下記の通りです。 1.session_set_save_handler関数はどこに記述すればいいのでしょうか。 2.ユーザー定義のセッション保存関数(f_open、f_close、f_read、f_write、f_destroy、f_clean)はどのように記述すればいいのでしょうか。 このような書き方をして申し訳ありませんが私を助けて下さい。 すみませんがご教授いただけませんでしょうか。 データベースはPostgreSQL 8.4.9です。 宜しくお願いします。

    • 締切済み
    • PHP
  • Cookie非使用のセッションについて

    携帯サイトを作成しているので、URLに直接IDを埋め込む形でセッションさせたいのですが、うまくいきません。 レンタルサーバ(heteml)には『php.iniの設定-session.use_trans_sid』が用意されているのですが、クッキー環境であればそちらを優先したいので、携帯サイト向けのファイルのソース上で何とかしようとしている所です。 そんな訳で、サーバーの『php.iniの設定-session.use_trans_sid』はOFFにした状態で **************a.php********************************** <?php ini_set("session.use_cookies","0"); ini_set("session.use_trans_sid","1"); session_start(); $_SESSION["test"] = "テストです"; echo "<a href=\"b.php\">セッションテスト</a>"; ?> ***************************************************** **************b.php********************************** <?php ini_set("session.use_cookies","0"); ini_set("session.use_trans_sid","1"); session_start(); echo $_SESSION["test"]; ?> ***************************************************** と、したのですがうまくいきません。 ini_set関数の使い方が間違っているのでしょうか? また、手動でIDを埋め込むやり方でも構いませんので、 ご存知の方いらっしゃいましたら宜しくお願いします!

    • ベストアンサー
    • PHP
  • SESSIONとGLOBALSとCLASSについて

    ご教授お願いいたします。 以下のこういったことは可能でしょうか? ■質問 「A.php」で クラスをグローバル変数に代入し、それをセッションに登録し、「B.php」で取り出すことは可能でしょうか。 ⇒可能な場合  「B.php」でどうやって取り出せばよいでしょうか。 ⇒不可能な場合  「A.php」から「B.php」へクラスを渡したいのですが、どうすればよいでしょうか? ■例 「A.php」というソースで クラスをグローバル変数に代入し、セッションに代入する。 ○例(A.php): $xxc = new XXX_XXX_CLASS(); $xxc->setA('aaa'); $GLOBALS['@XXX_XXX_CLASS'] = $xxc; session_start(); // セッションにセット $_SESSION['aaa'] = $GLOBALS['@XXX_XXX_CLASS']; // セッションのクローズ session_write_close(); ○例(B.php): session_start(); 取り出し方:1 $xxc = $_SESSION["aaa"]; // ←取り出せなかった。 $xxc->getA(); 取り出し方:2 $xxc = new XXX_XXX_CLASS(); $xxc = $_SESSION["aaa"]; // ←取り出せなかった。 $xxc->getA(); 取り出し方:3 ほかに取り出し方がありましたらご教授お願いいたします。 グローバル変数を通さないやり方もしてみたのですが、そちらでも出来ませんでした。 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 携帯サイト用PHPのセッションについて

    はじめまして。 携帯サイトでPHPのセッションを使ってリンク先の【Location:】内にURL情報を埋め込みたいのですが、「携帯ではクッキーがつかえない」「【session.use_cookies】と【session.use_trans_sid】の設定で使えるようになる。」と見たので試しているのですがうまくいきません。助けてください。 今試してみている記述内容は下記となっています。 ・記述内容: >>test_a/1.php <?php ini_set("session.use_cookies","0"); ini_set("session.use_trans_sid","1"); session_start(); $_SESSION['test'] = "http://xxx.xx/test_a/"; header("Location:http://xxx.xx/test_b/2.php? .session_name().'='.session_id()."); exit; ?> >>test_b/2.php <?php ini_set("session.use_cookies","0"); ini_set("session.use_trans_sid","1"); session_start(); echo "セッションは" .$_SESSION['test']; ?> 試しに"echo"で表示させてみたところ、PCでは「セッションはhttp://xxx.xx/test_a/」と表示されるのですが、携帯(FOMA F904i)では「セッションは」しか表示されません。 どなたか、よろしくお願いします。

    • 締切済み
    • PHP
  • セッションの有効期限

    Linux7.2 + PHP4.2(DSO版)+ Apacheを使用しセッション管理を使用した認証機能を制作しています。 session.cache_expire = 180としているのに ログイン後20分くらいでセッションが切れる現象が生じています。 プログラム上では特別なことはしていません。 session_start(); session_cache_limiter('nocache'); を先頭に書いているだけです。 以下、php.iniのセッション関連の設定です。 どなた方この現象についてご存知でしたら教えて下さい。 宜しくお願いします。 session_auto session.save_handler = files session.save_path = /tmp session.use_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.gc_probability = 1 session.gc_maxlifetime = 1440 session.referer_check = session.entropy_length = 0 session.entropy_file = ;session.entropy_length = 16 ;session.entropy_file = /dev/urandom session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0

    • 締切済み
    • PHP
  • 困ってます。phpセッションについて

    phpセッションについて教えてください。 既にwebサーバで動いているシステムがあります。 改修する必要があるため、パソコンの仮想サーバ(XAMPP)で動かした所、セッションに関わる部分がうまくいきません。 ●保存してる箇所 session_start(); session_regenerate_id( TRUE ); $_SESSION['xxx'] = $xxx; ●呼び出している箇所 session_start(); session_regenerate_id( TRUE ); if ( !isset( $_SESSION['xxx']) ) { //←ココでひっかかります //終了するための処理 exit; } $xxx = $_SESSION['xxx']; ************** 設定に関する部分です。 ●「.htaccess」の設定は以下のようにしています。 php_flag session.use_cookies On php_value session.cookie_lifetime 0 php_flag session.use_trans_sid Off php_value session.gc_maxlifetime 3600 php_value session.save_path 'C:temp' 'C:temp'に保存されたデータはありますので、書き出しはうまくいってるようです。 呼び出しがうまくいってません。 ソースの session_start(); session_regenerate_id( TRUE ); の直後に var_dump($_SESSION['xxx']); で値を参照するとNULLです。 ●「php.ini」のセッションの箇所は以下のようになっています。 session.save_handler = files よろしくお願いします。

    • ベストアンサー
    • PHP
  • sessionの使い方

    詳しい方がいましたら、ご教授下さいませ。 ---a.php--- <?php if(!isset($_SESSION['n']) {  session_start();  $_SESSION['n']='1'; } ?> ---------- ---b.php--- <?php session_start(); $_SESSION['n']='2'; ?> ---------- ---c.php--- <?php session_start(); echo($_SESSION['n']); ?> ---------- a.phpで、'1'をセットして保持し、 b.phpが動作したとき、'2'に入れ替えているのですが、 c.phpで確認すると、何故か'1'のままです。 一度セットした値を、入れ替えることって出来ないのでしょうか?

    • ベストアンサー
    • PHP
  • セッションが変数が取得できません

    こんにちは。初心者で大変申し訳ないのですが、2日間悩みましたがどうしても解決できないため質問させて頂きました。どうかご教授下さい。 PHPのセッション機能の利用をしようと以下のような環境でテストスクリプトを実行したのですが、うまくいきません。 PHPバージョン4.3.10 register_globals On session.auto_start Off session.bug_compat_42 On session.bug_compat_warn On session.cache_expire 180 session.cache_limiter nocache session.cookie_domain no value session.cookie_lifetime 0 session.cookie_path / session.cookie_secure Off session.entropy_file no value no session.entropy_length 0 session.gc_divisor 100 session.gc_maxlifetime 1440 session.gc_probability 1 session.name PHPSESSID session.referer_check no value session.save_handler files session.save_path /tmp session.serialize_handler php session.use_cookies Off session.use_only_cookies Off session.use_trans_sid On SESSION登録側スクリプト <?php session_start(); $_SESSION['tarou'] = 50; ?> <a href="test.php">test</a> 結果表示側スクリプト <?php session_start(); echo($_SESSION['tarou']); ?> session.use_trans_sid Onで透過的にURIにセッションIDを埋め込むタイプで、 セッションファイル自体は作られているのですが セッション変数は登録されておらず、空のセッションファイルとなってしまっています。 色々と調べてみたのですがどうしても解決できません。 大変お手数ですがどうか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • セッションの変数の受渡しについて

    よろしくお願いします。 セッションを利用して変数受渡しを行おうと思い、初めての試み なので簡単なものを作ってやってみたのですが、変数に値をセットしたtest.phpでは値が表示されますが、リンク先のtest2.phpでは表示されません。 以下のソースで試しています。 -------------------------------------------------- test.php <?php session_start(); session_register("aa"); $_SESSION['aa'] = 1234; print $_SESSION['aa']; print "<p>"; print "<a href='test2.php'>next</a>";←ここの画面では表示されます。 ?> test2.php <?php session_start(); print $_SESSION['aa'];←表示されません ?> ---------------------------------------------- 想定では画面に”1234”と出ると思っていたんですが・・。 他質問をみて真似て色々試したのですが、やはり表示できませんでした。 環境は以下です apache2 php ver4.4.4 session Session Support enabled Registered save handlers files user Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 100 100 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path c:\windows\Temp c:\windows\Temp session.serialize_handler php php session.use_cookies Off Off session.use_only_cookies On On session.use_trans_sid On On 環境の問題でしょうか?各ブラウザで試したのですが、ダメでした。 初歩的質問で申し訳ありませんが、ご教示よろしくお願いします。

    • ベストアンサー
    • PHP