セッションスタートでのエラーについて - PHPプロ!Q&A掲示板

455

  • 0P

セッションスタートでのエラーについて

質問日時 / 2007年4月12日 16:03    回答数 / 8件

Questioner:  TAKAGI  このエントリーをはてなブックマークに追加 

初めて掲示板に投稿します。
ご存知の方がいらっしゃればお教え下さい。

Webサーバー分散時のセッション管理にて自前セッションハンドラーでデータベースに
セッション情報を保持しようとしております。
しかし、session_start()、session_write_close()、session_start()の順で
処理すると最後のsession_start()で下記のエラーがでてしまい処理がとまってしまいます。


【エラー内容】
Fatal error: session_start() [<a href='function.session-start'>function.session-start</a>]: Failed to initialize storage module: user (path:) in C:\Inetpub\wwwroot\xxxxx.php on line 32

【セッションハンドラー】
  1. <?php
  2. function open ($save_path$session_name){
  3.     return true;
  4. }
  5. function close (){
  6.     return true;
  7. }
  8.  
  9. function read ($id){
  10.     $AR_SESSION = array();
  11.     // この部分はデータベースを読込んで結果を
  12.      // $AR_SESSIONにセットしています。
  13.     return $AR_SESSION;
  14. }
  15.  
  16. function write ($id$sess_data){
  17.     $AR_SESSION = array();
  18.     // この部分は、データベースを読込、なければ追加
  19.      // 既にあれば更新をしています。
  20.     return true;
  21. }
  22.  
  23. function destroy ($id){
  24.     // この部分は、既存データを削除しています。
  25.     return true;
  26. }
  27.  
  28. function gc ($maxlifetime){
  29.     return true;
  30. }
  31. session_set_save_handler('open','close','read','write','destroy','gc');
  32. ?>
実行環境は、Windows 2003 Server(IIS6.0)、ORACLE10.2.1、PHP5.2.1となっております。

宜しくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01tyatya 実際に試して言うないので確信をもってはいえません
 ┗A01-1TAKAGItyatyaさん、情報有難うございます。 しかし、現状
  ┗A01-1-1tyatyaTAKAGIさん。 たしかにdestoryまでたどり着かない形
   ┗A01-1-1-1TAKAGItyatyaさん有難うございます。 session_name()も元
    ┗A01-1-1-1-1tyatyaTAKAGIさん やはり結果は駄目そうですね・・ >>CO
     ┗A01-1-1-1-1-1TAKAGItyatyaさんテストまでして頂き有難うございます。
      ┗A01-1-1-1-1-1-1weekendphpもし、セッションをDBに保存したい、ということだけな
       ┗A01-1-1-1-1-1-1-1TAKAGIweekendphpさん、tyatyaさん貴重な情報有難うございま

回答一覧

並び替え:

A01
answerertyatya [4月12日 17:13]


実際に試して言うないので確信をもってはいえませんが、
いろいろ調べてみていたところ、PHPのバグらしいです。
http://bugs.php.net/bug.php?id=32330

session_set_save_handler()後にsession_destroy()を行うと、
セッション関係の情報が初期化されるだが、ハンドラの設定はそのまま残ってしまう。
その後にsession_start()を行うと上記のエラーが出る。

解決方法としては、session_destroy()後に再度session_set_save_handler()を行うことで、
問題解決できると書いてありました。
http://daikon.tea-nifty.com/blog/2007/03/s2eth.html

ご参考になれば幸いです。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerTAKAGI [4月12日 18:23]

tyatyaさん、情報有難うございます。

しかし、現状のコードではsession_destory()は使用しておりませんでした。
念のためfunction destroy ($id)の先頭にsession_save_handler()を記述したのですが、
同じ結果です。

又、何か情報がありましたらお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyertyatya [4月12日 18:48]

TAKAGIさん。
たしかにdestoryまでたどり着かない形でした。
見過ごしてました^^;

もう、閲覧されているかもしれませんが、
ここにも同じような情報が記述されていました。
http://hain.jp/index.php/tech-j/2006/08/11/session_set_save_handler_php

こちらの原因はセッション名を変えて使用すると「駄目」と記述されています。
ご参考までに^^

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerTAKAGI [4月12日 18:57]

tyatyaさん有難うございます。

session_name()も元の名前になっております。
色々と調べているのですが、問題解決に至っておりません。

又、情報ございましたらお願いします^^)ノ

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyertyatya [4月12日 20:39]

TAKAGIさん

やはり結果は駄目そうですね・・
  1. <?php 
  2. //require_once("./test.php");
  3.  
  4. session_start();
  5. print "test2";
  6. session_destroy();
  7. //session_write_close();
  8. session_start();
  9. ?>
のようにいろいろ呼び出して試してみましたが、
同じスクリプト内でstartを2回するというのがそもそも昔からnoticeを出す程度のエラー扱いですので、
アパッチなどのアプリケーションのようにstartとstopで開始、停止が操作できないみたいですね。

session_start以降でのセッション値の削除などはできるけど、
途中でセッションを止めるということができない?

でも、スクリプトが終了したらどうやって閉じているのかわかりませんが、
閉じているんだとおもいます。
↑これが見つかればできそうですが・・^^;

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyerTAKAGI [4月12日 20:56]

tyatyaさんテストまでして頂き有難うございます。

私も色々と試しているのですが、セッション保存にfileを使用すると、下記のようなスクリプトでも
エラー(警告も)が出ずに処理できます。

  1. <?php
  2.     session_start();
  3.     $_SESSION["AAA"] = "AAA"];
  4.     session_write_close();
  5.     session_start();
  6.     $_SESSION["BBB"] = "BBB"];
  7.     session_write_close();
  8.     exit;
  9. ?>
上記を処理するとファイルには、aaa|s:3:"aaa";bbb|s:3:"bbb";が書き込まれ正常に処理されている
ようです。

セッション情報をDBに保存するのは、多くのところでされておられると思いますので、
もう少し探してみます。

又、情報がございましたらお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1 参考になった
replyerweekendphp [4月13日 11:50] (最終編集:4月13日 11:54)

もし、セッションをDBに保存したい、ということだけなら、
ADOdb や PEAR HTTP_Sessionなどの既存のライブラリの使用を
考慮してもいいかもしれません。

その方が、一から作るよりは随分信頼性も高いですし。

個人的にはADOdbのセッション管理がオススメです。
http://www.souken.co.jp/tech/php/adodb/docs-session_ja.htm
Oracleも対応済みのようです。
http://www.souken.co.jp/tech/php/adodb/docs-adodb-ja.htm#drivers

意向と違っていたら、すみません。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1
replyerTAKAGI [4月13日 13:28]

weekendphpさん、tyatyaさん貴重な情報有難うございました。

今回は、ファイルで管理することになりましたのでクローズ致します。

皆様、有難うございました。^^;

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)