Sprawdź czy sesja PHP już się rozpoczęła

Mam plik PHP, który jest czasami wywoływany ze strony, która rozpoczęła sesję, a czasami ze strony, która nie ma rozpoczętej sesji. Dlatego kiedy mam session_start() na tym skrypcie czasami pojawia się komunikat o błędzie "sesja już rozpoczęta". Za to wstawiłem te linijki:

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

Ale tym razem dostałem wiadomość ostrzegawczą:

Notice: Undefined variable: _SESSION

Czy jest lepszy sposób na sprawdzenie czy sesja już zaczął?

Jeśli użyję @session_start czy to sprawi, że wszystko będzie działać poprawnie i po prostu zamknąć Ostrzeżenia?

Author: random, 2011-06-06

25 answers

Zalecany sposób dla wersji PHP >= 5.4.0

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

Źródło: http://www.php.net/manual/en/function.session-status.php

Dla wersji PHP

if(session_id() == '') {
    session_start();
}
 635
Author: lovelyramos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 13:16:02

Dla wersji PHP przed PHP 5.4.0:

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

Chociaż, IMHO, powinieneś naprawdę pomyśleć o refaktoryzacji kodu zarządzania sesją, jeśli nie wiesz, czy sesja jest rozpoczęta...

To powiedziawszy, moja opinia jest subiektywna i są sytuacje (których przykłady opisano w komentarzach poniżej), w których może nie być możliwe, aby wiedzieć, czy sesja została rozpoczęta.

 158
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 16:28:50

PHP 5.4 wprowadził session_status () , który jest bardziej niezawodny niż poleganie na session_id().

Rozważ następujący fragment:

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

Więc, aby sprawdzić, czy sesja jest rozpoczęta, zalecanym sposobem w PHP 5.4 jest teraz:

session_status() == PHP_SESSION_ACTIVE
 65
Author: Benjamin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-28 09:07:36

Możesz to zrobić i to naprawdę proste.

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

Mam nadzieję, że pomoże:)

 32
Author: miyuru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 14:25:54
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }
 20
Author: k.bon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-12 07:34:46

Przed PHP 5.4 nie ma wiarygodnego sposobu poznania innego niż ustawienie flagi globalnej.

Rozważmy:

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

Lub:

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.

Więc przed PHP 5.4 powinieneś ustawić globalny boolean.

 20
Author: Ryan Yoosefi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 10:14:07

Dla wszystkich wersji php

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}
 9
Author: supersuphot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-12 16:23:06

Sprawdź to:

<?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();
?>

Źródło http://php.net

 7
Author: Elshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-22 10:39:44

Użyj session_id () , zwraca pusty łańcuch, jeśli nie jest ustawiony. Jest bardziej niezawodny niż sprawdzanie $_COOKIE.

if (strlen(session_id()) < 1) {
    session_start();
}
 5
Author: Wesley van Opdorp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 10:51:45
if (session_id() === "") { session_start(); }
Mam nadzieję, że to pomoże !
 5
Author: Mahesh Cheliya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 07:01:21

To powinno działać dla wszystkich wersji PHP. Określa wersję PHP, a następnie sprawdza, czy sesja została uruchomiona w oparciu o wersję PHP. Następnie, jeśli sesja nie jest uruchomiona, uruchamia ją.

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();
    }
  }
}
 5
Author: Dustin Poissant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 01:04:25

Jedyne co musisz zrobić to:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>
 4
Author: user3140580,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-27 20:48:49

Nie jestem pewien skuteczności takiego rozwiązania, ale to z pracującego projektu Jest to również używane, jeśli chcesz zdefiniować domyślny język

   /**
    * 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
Author: Alex Khimich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-26 23:23:42

Powinieneś zreorganizować swój kod tak, aby wywoływać session_start() dokładnie raz na wykonanie strony.

 1
Author: SamT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 09:07:00

Na PHP 5.3 działa mi to:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 
Więc masz. Jeśli nie umieścisz na początku instrukcji not at if, sesja rozpocznie się w jakikolwiek sposób, nie dlaczego.
 1
Author: Lucas M. Oliveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-28 06:27:57

ODPOWIEDŹ na podstawie odpowiedzi @ Meliza Ramos (patrz pierwsza odpowiedź) i http://php.net/manual/en/function.phpversion.php ,

Działania:

  • define PHP_VERSION_ID if not exist
  • zdefiniuj funkcję, aby sprawdzić wersję na podstawie PHP_VERSION_ID
  • define function to opensession () secure

Używaj tylko 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
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 17:07:48
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

Właściwie, jest już za późno, aby wyjaśnić to tutaj i tak, jak to zostało rozwiązane. To było ... plik inc jednego z moich projektów, w którym konfigurujesz menu restauracji wybierając danie i usuwasz / dodajesz lub zmieniasz kolejność. Serwer, na którym pracowałem, nie miał rzeczywistej wersji, więc zrobiłem go bardziej elastycznym. To zależy od autorów, którzy chcą go użyć i wypróbować.

 1
Author: Thielicious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-18 10:08:22

Czy ten fragment kodu działa dla Ciebie?

if (!count($_SESSION)>0) {
    session_start();
}
 1
Author: Niroshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 04:08:35
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}
 0
Author: Sukanya Suku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 09:52:56

PHP_VERSION_ID jest dostępny od wersji PHP 5.2.7, więc najpierw sprawdź tę opcję i w razie potrzeby utwórz ją. session_status jest dostępny od wersji PHP 5.4, więc też musimy to sprawdzić:

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
Author: Christian Kruse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-25 17:06:03

Bazując na mojej praktyce, przed uzyskaniem dostępu do $_SESSION[] musisz zadzwonić session_start za każdym razem, aby użyć skryptu. Zobacz poniższy link do instrukcji.

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

Dla mnie przynajmniej session_start jest mylące jako nazwa. A session_load może być bardziej jasne.

 0
Author: Eduard Hasanaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 05:25:12

Skończyłem z podwójną kontrolą statusu. php 5.4 +

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
 0
Author: Leo Tahk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 18:03:36

Możesz użyć następującego rozwiązania, aby sprawdzić, czy sesja PHP już się rozpoczęła:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}
 0
Author: Manjeet Kumar Nai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 20:46:10

To jest to, czego używam do określenia, czy sesja się rozpoczęła. Używając empty i isset w następujący sposób:

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}
 0
Author: Akintunde-Rotimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 19:02:08

Zastąp session_start(); przez:

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}
 -2
Author: Harshit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 07:47:08