it-roy-ru.com

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

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

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

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

Примечание: неопределенная переменная: _SESSION 

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

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

416
Logan

Рекомендуемый способ для версий 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();
}
669
lovelyramos

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

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

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

Тем не менее, мое мнение субъективно, и есть ситуации (примеры которых описаны в комментариях ниже), где может быть невозможно узнать, начался ли сеанс.

160
Alex

В 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
70
Benjamin

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

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

Надеюсь, поможет :)

35
miyuru

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

21
Ryan Yoosefi
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }
21
k.bon

Для всех версий PHP

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

Проверь это :

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

9
Elshan

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

if (strlen(session_id()) < 1) {
    session_start();
}
6
Wesley van Opdorp

Это должно работать для всех 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();
    }
  }
}
5
Dustin Poissant
if (session_id() === "") { session_start(); }

надеюсь, поможет !

5
Mahesh Cheliya

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

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

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

   /**
    * 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
Alex Khimich

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

1
SamT
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 одного из моих проектов, где вы настраивали меню для ресторана, выбирая блюдо и удаляя/добавляя или изменяя order . На сервере, на котором я работал, не было актуальной версии, поэтому я сделал ее более гибкой. Это зависит от авторов, которые хотят использовать и попробовать.

1
Thielicious

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

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

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

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

тогда у вас есть. Если вы не поместите оператор not at if в начало, сеанс начнется любым способом, я не знаю почему. 

1
Lucas M. Oliveira

Ответ на основе @Meliza Ramos Response (см. Первый ответ) и 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
user1817927

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

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}
0
Manjeet Kumar Nai
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}
0
Sukanya Suku

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

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}
0
Akintunde-Rotimi

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

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

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

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

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

0
Eduard Hasanaj

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();
    }
}
0
Christian Kruse