2011-09-09 22 views
2

私はとのセッションを開始しました状況があります。PHPセッションの開始を防ぐ方法を教えてください。

session_id($consistent_session_name_for_user); 
session_start(); 
$_SESSION['key'] = $value; 

が、その後、私は私が実際に(書き込み)このセッションを「コミット」したくない決定を。 PHPはsession_abort_write()の機能を持っていないようです。私は以前のスクリプトの実行からセッション変数を破壊したくないので使用できませんsession_destroy()

私はsession_id("")を試しましたが、その呼び出しは失敗します。私はsession_id("trash")のような別のセッションに書き込むようにセッションを "リダイレクト"することができましたが、PHP(Apache)接続の多くが同じセッション "ファイル"に書き込もうとします。

私はこの問題を非常に単純化しています。実際にはMemcachedにセッションを格納していますが、これは複雑なコードベースです。だから、私はMemcachedサーバーに常に不要な「ゴミ箱」セッションを送りたいとは思わない。 PHP.net、
session_regenerate_id から

答えて

1

このメソッドは、セッションストアにセッションを書く防ぐが、ここで私は最終的に使用する溶液だ場合、私は実際には決定していない。これはその何も効果があり、私は願っています

session_id('trash'); // or call session_regenerate_id() as someone else suggested 
$_SESSION = array(); // clear the session variables for 'trash'. 

PHPがまだsess_trashが存在していないことを知ることができないので、空のファイルを書き込むと思います。

セッションの書き込みを完全に避けたい場合は、PHPでカスタムセッションハンドラを使用し、セッションの書き込みを防ぐためにグローバルフラグを設定する必要があります。

+0

+1グローバルフラグは、セッションの書き込みを防ぎます。 – FixMaker

1

は、新しいものと現在のセッションIDを交換し、 現在のセッション情報を保持します。

session_unset登録されているすべての変数
session_unregister (string $name)は、特定の変数

+0

ありがとうございますが、私は既存のセッション変数の設定を解除または登録を取り消したくありません。 'session_regenerate_id'は私が' session_id( "trash") 'で提案したのと同じ種類のものですが、セッション配列全体を書くのは避けたいと思います。 – Toxikman

0

session_write_close()があるの登録を解除します解放されます。セッション配列をストレージにダンプして閉じます。$ _SESSIONは引き続き使用可能で読み書き可能ですが、後でスクリプト内でsession_start()を再度実行しない限り、変更は保存されません。

+0

良いアイデアですが、残念ながら$ _SESSIONにはすでに変更が加えられていますので、私は "捨てたい" – Toxikman

+0

これらの使い捨ての変更を行う前にwrite_closeを実行してください。これは、最初のsession_startコールの後のいつでも実行できます。 –

+0

私はできません - セッションデータをスローする必要があるかどうかはわかりませんが、$ _SESSIONプロパティが変更された後でなければなりません。また、ネットワークを介して(ゴミ箱に)デッドデータを送信する可能性があるので、セッションに書き込むことを避けたい。 – Toxikman

0

おそらくsession_set_save_handlerで何かを使って、セッション処理のためにダミー関数を入れることができます。

<?php 
function fakeIt() { 
    return true; 
} 
session_set_save_handler("fakeIt", "fakeIt", "fakeIt", "fakeIt", "fakeIt", "fakeIt"); 
+0

これは素晴らしいアイデアです。私はそれを試しました。残念ながら、 'session_set_save_handler'を' session_start'前に呼び出さなければなりません。それ以外の場合は効果がありません。すでにセッションが開始されてからセッションを終了するかどうかはわかりません。 – Toxikman

+0

memcachedセッション書き込み用のラッパーメソッドを作成して、 'ゴミ箱'フラグをチェックする必要があります。 – rrehbein

+0

唯一の問題は、memcachedのネイティブセッションセーブハンドラを使用することだけです。他のメソッドのネイティブハンドラを引き続き使用しながら、 '書き込み'メソッドをラップすることが可能かどうか疑問です。 – Toxikman

関連する問題