2009-07-05 10 views
2

session_set_save_handler()をphp5に使用するphp4アプリケーションを移行する必要があります。php4からphp5へのコールバックによるセッションの移行奇妙な動作

php4ではすべて問題ありませんでしたが、php5ではコールバック関数がグローバル変数にアクセスできなくなりました。これはsession_set_save_handler()が呼び出される前にページに設定されていました。グローバル変数$ G1以下の例では

session_writer()にアクセスすることはできません(コールバック関数として渡される)

は、この動作のためのいくつかの説明があります。また、コールバックとのセッションの移行のヒントを与えることができますphp4から5へ?これは実際documentationに留意されたい

function session_writer($id,$vars) { 
    global $g1; 
    echo "g1 not defined here: ".is_object($g1); 
} 

global $g1; 
$g1 = SomeObject(); //which is the DB connection for the session writer 

session_set_save_handler($o,$c,$r,"session_writer",$d,$g); 
session_start(); 

答えて

3

この

は擬似コードである

PHPのように書き込みおよびクローズハンドラ5.0.5オブジェクトの破壊後に呼び出され、したがってできませんオブジェクトを使用するか、例外をスローします。ただし、オブジェクトデストラクタはセッションを使用できます。

この鶏と卵の問題を解決するには、デストラクタからsession_write_close()を呼び出すことができます。

<?php register_shutdown_function("session_write_close"); ?> 

これらのソリューションのどちらかが前にセッションの書き込みや閉鎖を強制する必要があります:あなたはSomeObjectのデストラクタからsession_write_close()を呼び出す、あるいは、次の操作を実行する必要があります基本的に

、すべてのオブジェクトが破壊され、元のコールバック機能を維持できます。

+0

ありがとう、私はここで何が起こっているのか把握し始めています。 SomeObject()は私のデータベースです。だから私はリファクタリングし、session_writer自体にDBオブジェクトの作成をコピーすることができます、これは最も簡単でしょうか? – user89021

+0

いいえ、オブジェクトを破壊する前にセッションの書き込みを強制しない限り、実際にはオブジェクトを使用できません。私が言ったように、いくつかのオブジェクトデストラクタからsession_write_close()を呼び出すか、shutdown関数として登録する必要があります。 – molf

0

モルフの答えが問題を特定します。ここにいくつかの情報があります:

は、識別子とそれに関連付けられたデータを入力として取ります。最小限の変更を行う場合は、おそらくデータがsession_encode()($ _SESSION配列の内容をエンコードする文字列)によって返されるものであることを知る必要があります。識別子はsession_id()によって返されるものです。