89

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

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

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

4

12 に答える 12

282

試す

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    } 
?>
于 2012-05-18T08:09:20.783 に答える
34

新しいものが必要な場合は、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();
}

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

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

于 2012-05-18T08:09:54.627 に答える
5

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

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

またはあなたが使用することができます

unset($_SESSION['variable_session _data'])

特定のセッション変数を破棄します。

于 2012-05-18T08:52:23.313 に答える
4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

クローズドゲーム

于 2019-10-02T18:27:57.267 に答える
2

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

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

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

于 2012-05-18T23:32:36.640 に答える
1

インクルードを介して再度呼び出される可能性があるセッションの開始を既に呼び出している必要がありますか?

if( ! $_SESSION)
{
    session_start();
}  
于 2012-05-18T08:09:54.323 に答える
1

$_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]);

この関数は、キー=>値のペアの配列を取り、さらに効率的にします。

于 2017-07-07T04:40:02.323 に答える
1

if文を使うだけ

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

また

現在のセッション ステータスを返す session_status でセッション ステータスを確認し、現在のセッションがすでに機能している場合は、セッションが機能していない場合は何も返さずにセッションを開始します


session_status() === PHP_SESSION_ACTIVE ?: session_start();
于 2020-08-17T14:45:22.953 に答える
0
<?php
if ( session_id() != "" ) {
    session_start();
}

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

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

于 2012-05-18T08:12:39.970 に答える
0

これを試して

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

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

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

于 2014-09-25T09:10:03.170 に答える