web-dev-qa-db-ja.com

PHPすでに開始されたセッション

PHPコードで、セッションが既に開始されていて、新しいセッションを開始しようとすると、次の通知が表示されます。

Notice:セッションはすでに開始されています-session_start()を無視します

どうすればこれを回避できますか?

71
user1400702

試して

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    } 
?>
217

新しいものが必要な場合は、開始する前にsession_destroy()を実行してください。開始する前にそのセットを確認するには、 session_status() を呼び出します。

$status = session_status();
if($status == PHP_SESSION_NONE){
    //There is no active session
    session_start();
}else
if($status == PHP_SESSION_DISABLED){
    //Sessions are not available
}else
if($status == PHP_SESSION_ACTIVE){
    //Destroy current and start new one
    session_destroy();
    session_start();
}

代わりにグローバル$_SESSIONをチェックすることを避けますPHPはこの関数を明示的に実装しているため、session_status()メソッドを呼び出しています。

新しい関数session_statusを使用してセッションステータスを公開するこれは(PHP> = 5.4.0)

28
Juan Cortés

前のセッションを破棄したい場合のみ:

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    }
    else
    {
        session_destroy();
        session_start(); 
    }
?>

または使用できます

unset($_SESSION['variable_session _data'])

特定のセッション変数を破棄するために

4
Code Spy

はい、isset($_SESSION)をチェックすることで、セッションがすでに実行されているかどうかを検出できます。ただし、最善の答えは、session_start()を複数回呼び出さないことです。

スクリプトの非常に早い段階、場合によっては最初の行でも呼び出す必要があり、その後は再度呼び出さないでください。

コードの複数の場所にある場合は、この種のバグを取得するよう求めています。 1か所にまとめて、1回しか呼び出せないように切り取ります。

2
Spudley

あなたはすでにセッション開始を呼び出さなければなりません

if( ! $_SESSION)
{
    session_start();
}  
1
MikeCruz13

より効率的です:

@session_start();

画面でのエラーハンドラーの回避

ベスト、

0
Jos3

$ _SESSIONのブロック動作を修正しようとしたときにこの問題が発生しました。

http://konrness.com/php5/how-to-prevent-blocking-php-requests/

セッションファイルは、スクリプトが完了するか、セッションが手動で閉じられるまでロックされたままです。

そのため、デフォルトでは、ページはセッションを読み取り専用モードで開く必要があります。ただし、読み取り専用で開いたら、書き込みモードで閉じて再度開く必要があります。

const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;

/**
 * Open _SESSION read-only
 */
function OpenSessionReadOnly() {
    session_start([
                      'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
                      'read_and_close'  => true,    // READ ACCESS FAST
                  ]);
    // $_SESSION is now defined. Call WriteSessionValues() to write out values
}

/**
 * _SESSION is read-only by default. Call this function to save a new value
 * call this function like `WriteSessionValues(["username"=>$login_user]);`
 * to set $_SESSION["username"]
 *
 * @param array $values_assoc_array
 */
function WriteSessionValues($values_assoc_array) {
    // this is required to close the read-only session and 
    // not get a warning on the next line.
    session_abort();

    // now open the session with write access
    session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);

    foreach ($values_assoc_array as $key => $value) {
        $_SESSION[ $key ] = $value;
    }
    session_write_close();  // Write session data and end session

    OpenSessionReadOnly(); // now reopen the session in read-only mode.
}

OpenSessionReadOnly();  // start the session for this page

次に、値を書きに行くと:

WriteSessionValues(["username"=>$login_user]);
0
TrophyGeek

上記のどれも適切ではなく、$ Session変数に依存するすべてのphpファイルでsession_start()を呼び出さずに、それらは含まれません。通知は非常に迷惑で、Error_logをすぐにいっぱいにします。私が見つけることができる唯一の解決策はこれです...

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

悪い修正ですが、動作します。

0
Wayne Kirk

これを試して

if(!isset($_SESSION)){ 
    session_start();
}

Ob_start()を使用することをお勧めします。セッション変数を開始する前に、ブラウザのバッファを順序付けする必要があります。

編集:$ _SESSIONの後に)を追加しました

0
user2521037
<?php
if ( session_id() != "" ) {
    session_start();
}

基本的に、別のセッションを作成する前に、セッションが開始されたかどうかを確認する必要があります。 ...もっと読む

一方、 session_destroy() を使用して別のセッションを作成する前に、既存のセッションを破棄することを選択しました。

0
Odinn