PHPセッションがすでに開始されているかどうかを確認します


461

セッションを開始したページから呼び出されたり、セッションが開始されていないページから呼び出されたりするPHPファイルがあります。したがって、session_start()このスクリプトを実行すると、「セッションはすでに開始されています」というエラーメッセージが表示されることがあります。そのために私はこれらの行を入れました:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

今回はこの警告メッセージが表示されました。

通知:未定義の変数:_SESSION

セッションがすでに開始されているかどうかを確認するより良い方法はありますか?

私が使用@session_startする場合、それは物事が適切に機能し、警告をシャットダウンするだけですか?



また、StackOverflowののこの答えを参照してください:stackoverflow.com/questions/1545357/...を
コンタクトform.co_you_go

回答:


761

PHP> = 5.4.0のバージョンに推奨される方法、PHP 7

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

リファレンス:http : //www.php.net/manual/en/function.session-status.php

PHP <5.4.0のバージョンの場合

if(session_id() == '') {
    session_start();
}

1
PHP 5.4未満のソリューションには問題があると思います。session_idは最初にセッションが開始されたときに設定されますが、セッションが閉じられても削除されません。だから、例えば、スニペット、のようなコードの前に、存在する場合session_start();session_write_close();:その後、条件が失敗したが、我々は何のオープンセッションがない場合は...
ニコロマティーニ

@Nicolo Martini私が理解しているように:session_start()スクリプトの上部で開始されたセッションは、スクリプトが終了するとき、またはsession_write_closed()スクリプトが終了する前に呼び出されるときに閉じられます。つまり、データがセッションCookieに書き込まれ、「session_start」を呼び出す別のスクリプトによるアクセスのためにセッションがロック解除されると、セッションは閉じます。したがって、CLOSINGは、セッションが破棄されることを意味しません。現在のスクリプトを終了するかを呼び出すとセッションを閉じることができsession_write_close()、を呼び出すとセッションを再び開くことができますsession_start()。少なくとも私の理解。
Stefan

1
これはまだセッションを開始する良い方法ですか?リンクにはこの回答に関連するものは何もないため
csandreas1

@ csandreas1には、リンクからsession_statusの説明と予想される戻り値が表示されます。あなたの質問への答えはイエスです!
lovelyramos

いくつかの状況でこれが失敗しました-if(!isset($ _ SESSION))を使用して成功しました
スコット

161

PHP 5.4.0より前のバージョンのPHPの場合:

if(session_id() == '') {
    // session isn't started
}

ただし、私見では、セッションが開始されているかどうかがわからない場合は、セッション管理コードのリファクタリングを検討する必要があります。

とはいえ、私の意見は主観的であり、セッションが開始されたかどうかを知ることができない場合があります(その例は以下のコメントに記載されています)。


37
セッションが開始されたかどうかを知らなくても、必ずしも悪いことではありません。遅延読み込み(最初に必要になったときにのみセッションを開始する)の場合、回答のテストは完全にうまくいきます。
ドリュー

1
また、一部の環境では、Apacheがセッション自動起動を設定しています
LeonardChallis

session_id()がインクルードファイルで空の文字列を返すかどうかをテストする例:
tgoneil

3
タール化されているかどうかがわからない場合のセッション管理のリファクタリングに関するコメントは、実際には関係ありません。たとえば、高度な機能をWordPressテーマにコーディングする場合、プラグインがチェックなしでセッションの使用をすでに開始しているかどうかはわかりません。コーディングの世界は必ずしも白黒であるとは限りません:P
Jimbo Jonny

うーん、確かに良い点です。私のコメントは非常に主観的であることを認めます。これを反映するために私の回答を修正します。
Alex

71

PHP 5.4 は、依存するよりも信頼性の高いsession_status()を導入しましたsession_id()

次のスニペットを考えてみましょう:

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

したがって、セッションが開始されたかどうかを確認するために、PHP 5.4で推奨される方法は次のとおりです。

session_status() == PHP_SESSION_ACTIVE

3
使用可能な場合はsession_statusを使用し、そうでない場合は古いメソッドを使用するコードのスニペットBTW、ヒントヒント:)
Jimbo Jonny

1
ベンジャミンのアップデートありがとうございます。PHP 5.4以降、新しいメソッドを使用できることを知っておくと便利です。
Logan

1
これはこれをチェックするはるかに優れた方法です。特に、ユーザーがサイトを閲覧している最中にユーザーがCookieをクリアしたときにセッションが開始されているかどうかは常にわかりません...私は常に2歳のユーザーをコード化します。ユーザーが何をするかわからない;-)私については、すべてのスクリプトで変数やその他の情報を設定するために呼び出される小さなConfig.phpファイルがあるので、このファイルにこれを追加するだけで常にセッションが開始されることが保証されますそれが必要です
アンディブラハム2013年

35

あなたはこれを行うことができ、それは本当に簡単です。

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

それが役に立てば幸い :)


6
@zloctb:どんな状況でも考えられない$_SESSION=array();ので、この答えは問題ないようです。
2013年

5
@halferライアンの答えを見てください。session_destroy()呼び出された場合$_SESSIONでも設定できます。また、単体テストでは$_SESSION直接設定することもできます。しかし、私はこれに賛成しました。ほとんどの実際的な状況では、この答えは十分です(PHP 5.3がこれ以上見られなくなるまで...)
Darren Cook

22
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }

21

PHP 5.4より前のバージョンでは、グローバルフラグを設定する以外に信頼できる方法はありません。

検討してください:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

または:

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

そのため、PHP 5.4より前のバージョンでは、ブール値をグローバルに設定する必要があります。


12

すべてのPHPバージョン

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}

1
同様に、次のこともできますif ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Anthony Hatzopoulos 2014年

9

これをチェックして :

<?php
/**
* @return bool
*/
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();
?>

ソースhttp://php.net




5

これはすべてのPHPバージョンで機能するはずです。PHPのバージョンを判別し、セッションがPHPのバージョンに基づいて開始されているかどうかを確認します。次に、セッションが開始されていない場合は開始します。

function start_session() {
  if(version_compare(phpversion(), "5.4.0") != -1){
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }
  } else {
    if(session_id() == '') {
      session_start();
    }
  }
}

4

あなたがしなければならない唯一のことは:

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

これは私が長年使ってきたものです。これを使用しないことを支持している人はいますか?もちろん、セッションが時々開始されるかどうかのチェックを使用するのは良いことです-一部の環境では、Apacheはセッション自動開始セットアップ、レイジーロード(最初に必要なときにのみセッションを開始する)、または単に高速ハックを行う必要がある場合があります
K 。キリアン・リンドバーグ

IS THE SAME RESPONSE ABOVE(@miyuru)

2

そのようなソリューションの効率については不明ですが、これは作業プロジェクトからのものです。これは、デフォルト言語を定義する必要がある場合にも使用されます

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }

2

@ 関数呼び出しの前に、関数呼び出し中に報告される可能性のあるエラーを抑制します。

@前に追加session_startエラーメッセージが出力されないようにPHP指示します。

例えば:

session_start()ブラウザーに何かを印刷した後で使用するとエラーが発生するため、PHPは「ヘッダーを送信できません:(12行目から)開始」のようなものを表示します。@session_start()が、この場合は失敗しますが、エラーメッセージは印刷されません画面。

ファイルを含めるか、新しいページにリダイレクトする前に、 exit()関数をます。それ以外の場合はエラーになります。

このコードはすべての場合に使用できます。


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>

1

PHP 5.3では、これは私にとってはうまくいきます:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 

その後、あなたは持っています。セッションを開始するifステートメントがnot atを指定しないと、何らかの理由でセッションが開始されます。理由はわかりません。


1

@Melizaラモス応答に基づいて応答(最初の応答を参照)とhttp://php.net/manual/en/function.phpversion.php

行動:

  • 存在しない場合はPHP_VERSION_IDを定義します
  • PHP_VERSION_IDに基づいてバージョンをチェックする関数を定義します
  • openSession()に安全な関数を定義する

openSession()のみを使用

    // PHP_VERSION_ID is available as of PHP 5.2.7, if our
    // version is lower than that, then emulate it
    if (!defined('PHP_VERSION_ID')) {
        $version = explode('.', PHP_VERSION);

        define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));


        // PHP_VERSION_ID is defined as a number, where the higher the number
        // is, the newer a PHP version is used. It's defined as used in the above
        // expression:
        //
        // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
        //
        // Now with PHP_VERSION_ID we can check for features this PHP version
        // may have, this doesn't require to use version_compare() everytime
        // you check if the current PHP version may not support a feature.
        //
        // For example, we may here define the PHP_VERSION_* constants thats
        // not available in versions prior to 5.2.7

        if (PHP_VERSION_ID < 50207) {
            define('PHP_MAJOR_VERSION',   $version[0]);
            define('PHP_MINOR_VERSION',   $version[1]);
            define('PHP_RELEASE_VERSION', $version[2]);

            // and so on, ...
        }
    }

    function phpVersionAtLeast($strVersion = '0.0.0')
    {
        $version = explode('.', $strVersion);

        $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];

        if(PHP_VERSION_ID >= $questionVer)
            return true;
        else
            return false;

    }

    function openSession()
    {
        if(phpVersionAtLeast('5.4.0'))
        {
            if(session_status()==PHP_SESSION_NONE)
                session_start();
        }
        else // under 5.4.0
        {
            if(session_id() == '')
                session_start();
        }
    }

1
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

実際には、解決されているので、とにかくここでそれを説明するには遅すぎます。これは、料理を選択してレストランのメニューを構成し、順序を削除/追加または変更する、私のプロジェクトの1つの.incファイルでした。私が働いていたサーバーには実際のバージョンがなかったので、もっと柔軟にした。それは作者が使いたい、試してみたいところ次第です。


1

このコードスニペットはあなたに適していますか?

if (!count($_SESSION)>0) {
    session_start();
}

0

session_start()ページの実行ごとに1回だけ呼び出すようにコードを再編成する必要があります。


4
ページ実行ごとに1回だけ呼び出すことは、状況によっては望ましくない場合があります。
Timo Huovinen、2012

セッションを強制終了して再作成する場合は、確かに、それは特別なケースです。一般に、アプリケーションには、最初に最初に実行されるコードが必要です。これは、session_start()が移動する場所です。
SamT 2012

1
たとえば、アプリケーションはセッションをファイルに保存し、データの2つの同時低速リクエストをロードする必要があります。これらのリクエストはいずれもセッションを必要としませんが、session_startがセッションファイルをロックするため、一方は他方をブロックします。
Timo Huovinen、2012

丁度。@YuriKolovskyは正しいです。これらのケースが発生する可能性があるため、アレックスの質問は適切であり、それらは珍しいことではありません。
パウロコギ-

14
-1、ほとんどのWebサイトはCMS駆動であり、テーマやプラグインなどのものがあり、多くの場合、さまざまな関係者によって作成され、互いのコードがセッションを開始したかどうかを知ることはありません。これがコード編成の問題であるということは、単なる誤りです。
Jimbo Jonny

0
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}

0

PHP_VERSION_IDはPHP 5.2.7 以降で使用できるため、まずこれを確認し、必要に応じて作成してください。 session_statusPHP 5.4以降で利用できるため、これも確認する必要があります。

if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);
    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
    $version = PHP_VERSION_ID;
}
if($version < 50400){
    if(session_id() == '') {
        session_start();
    }
}else{
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
}

0

私の慣習に基づいて、アクセスする前$_SESSION[]に呼び出す必要がありますsession_start、スクリプトを使用するために毎回ます。マニュアルについては、以下のリンクを参照してください。

http://php.net/manual/en/function.session-start.php

少なくとも私にとってsession_startは名前として混乱しています。A session_loadはより明確にすることができます。


0

私はステータスのダブルチェックで終わった。PHP 5.4以降

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};


0

これは、セッションが開始されたかどうかを判断するために使用するものです。emptyとissetを使用して、次のようにします。

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

-3

と置き換えますsession_start();

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}

コードエラーが含まれており、同じファイルが複数回含まれる場合にのみ機能しますが、クロージャ内にある場合は機能しません。
BananaAcid 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.