2

使用する php4 アプリsession_set_save_handler()を php5 に移行する必要があります。

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

session_writer()以下の例では、 (コールバック関数として渡される)グローバル変数 $g1 にアクセスできません。

この動作について何らかの説明がありますか、またはコールバックを使用してセッションを php4 から 5 に移行する際のヒントを教えてください。

これは擬似コードです:

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();
4

2 に答える 2

3

これは実際にはドキュメントに記載されています:

PHP 5.0.5 では、オブジェクトの破棄後に write および close ハンドラが呼び出されるため、オブジェクトを使用したり、例外をスローしたりすることはできません。ただし、オブジェクト デストラクタはセッションを使用できます。

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

基本的に、session_write_close()のデストラクタから呼び出すSomeObjectか、次の手順を実行する必要があります。

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

これらのソリューションのいずれも、すべてのオブジェクトが破棄される前にセッションの書き込みと終了を強制する必要があり、元のコールバック関数を保持できます。

于 2009-07-05T21:59:17.063 に答える
0

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

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

于 2012-02-16T23:27:50.343 に答える