Проверить, если PHP сессия уже началась


у меня есть PHP-файл, который иногда вызывается со страницы, которая начала сеанс, а иногда со страницы, которая не начала сеанс. Поэтому когда у меня session_start() на этом скрипте я иногда получаю сообщение об ошибке для "сеанс уже запущен". Для этого я поставил следующие строки:

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

но на этот раз я получил это предупреждение:

обратите внимание: неопределенная переменная: _SESSION

есть ли лучший способ проверить, если сессия уже началась?

Если я использую @session_start это заставит все работать правильно и просто заткнуть предупреждения?

25 400

25 ответов:

рекомендуемый способ для версий PHP > = 5.4.0

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

Источник:http://www.php.net/manual/en/function.session-status.php

для версии PHP

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

для версий PHP до PHP 5.4.0:

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

хотя, IMHO, вы действительно должны подумать о рефакторинге кода управления сеансами, если вы не знаете, запущен ли сеанс...

в 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

вы можете сделать это, и это действительно легко.

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

надеюсь, что это помогает :)

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

до 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 вы должны установить глобальное логическое значение.

для всех версий php

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

проверить это :

<?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

использовать идентификатора session_id(), он возвращает пустую строку, если оно не задано. Это более надежно, чем проверка $_COOKIE.

if (strlen(session_id()) < 1) {
    session_start();
}
if (session_id() === "") { session_start(); }

надеюсь, что это помогает !

Это должно работать для всех версий 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();
    }
  }
}

единственное, что вам нужно сделать, это:

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

Не уверен в эффективности такого решения, но это из рабочего проекта Это также используется, если вам нужно определить язык по умолчанию

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

вы должны реорганизовать свой код так, чтобы вызвать session_start() ровно один раз за оформление страницы.

на PHP 5.3 это работает для меня:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 
у вас есть. Если вы не ставите оператор not at if, начинающий сеанс начнется каким-либо образом, я не знаю, почему.

ответ на основе ответа @Meliza Ramos (см. Первый ответ) и http://php.net/manual/en/function.phpversion.php,

действия:

  • определить PHP_VERSION_ID если не существует
  • определить функцию для проверки версии на основе PHP_VERSION_ID
  • определить функцию для openSession () secure

использовать только 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();
        }
    }
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

на самом деле, теперь уже слишком поздно объяснять это здесь, так как это было решено. Это был .inc файл одного из моих проектов, где вы настраиваете меню для ресторана, выбрав блюдо и удалить/добавить или изменить заказ. Сервер, на котором я работал, не имел фактической версии, поэтому я сделал его более гибким. Это до авторов хотят использовать и попробовать его.

этот фрагмент кода работает для вас?

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

PHP_VERSION_ID доступно с PHP 5.2.7, поэтому сначала проверьте это и , если необходимо, создайте его. session_status доступен с PHP 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();
    }
}

на основе моей практики, прежде чем получить доступ к $_SESSION[] нужно позвонить session_start каждый раз использовать скрипт. См. ссылку ниже для руководства.

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

для меня по крайней мере session_start сбивает с толку имя. А session_load может быть более ясным.

Я закончил с двойной проверкой статуса. php 5.4+

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

вы можете использовать следующее решение, чтобы проверить, если сеанс PHP уже начался:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}

Это то, что я использую, чтобы определить, если сеанс уже начался. Используя empty и isset следующим образом:

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

заменить session_start(); С:

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