すでに開始されているPHPセッション


82

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

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

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


3
古いセッションが実行されている場合、新しいセッションを開始しませんか?
マダラの幽霊

セッションがアクティブかどうかを見分ける方法の重複の可能性-質問する前に検索を使用してください。
hakre 2012年

私にとっては、session_start()を削除するだけで機能しましたが、セッションがすでに開始されている場合は、なぜ再度開始する必要があるのですか。私の場合は、コードに含まれているconfig.phpファイルでした
Mangesh Sathe 2018年

session_start()インクルードの1つに入れ、require_once必要なすべてのファイルに入れました。
nurchi

回答:


249

試してみてください

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

これにより、マスターページを使用してすべてのコンテンツをラップしている場合に、セキュリティの実装が容易になります。
レイモンドワチャガ2018

これは、session_start()を含むファイルをロードする場合としない場合にもお勧めします。これは、標準的な方法として優れています
SteveWhitby20年

31

新しいものが必要な場合は、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)用です


5

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

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

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

unset($_SESSION['variable_session _data'])

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


4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

クローズドゲーム


2

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

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

コード内の複数の場所にある場合は、この種のバグを取得するように求めています。1つの場所にのみ配置され、1回だけ呼び出すことができるように切り詰めます。


1

すでにセッションを呼び出している必要があります。おそらく、インクルードを介して再度呼び出されますか?

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

1
少し遅れますが、何らかの理由でこれは機能しません。(!isset($ _ SESSION))のみが機能します。
2013年

2
これを発火させるリスク:Notice: Undefined variable: _SESSIONisset代わりに使用してください。
T30 2015年

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

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


0

これを試して

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

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

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


0

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

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

悪い修正ですが、機能します。


0

それはより効率的でしょう:

@session_start();

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

ベスト、


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

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

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


0

ifステートメントを使用するだけです

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

または

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


session_status() === PHP_SESSION_ACTIVE ?: session_start();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.