Проверьте, началась ли сессия PHP - PullRequest
426 голосов
/ 06 июня 2011

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

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

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

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

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

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

Ответы [ 26 ]

703 голосов
/ 31 августа 2013

Рекомендуемый способ для версий 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 </strong>

if(session_id() == '') {
    session_start();
}
161 голосов
/ 06 июня 2011

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

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

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

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

70 голосов
/ 28 октября 2012

В 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
35 голосов
/ 28 марта 2013

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

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

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

21 голосов
/ 11 мая 2013

До 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 голосов
/ 12 апреля 2015
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }
11 голосов
/ 12 октября 2014

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

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}
9 голосов
/ 22 марта 2015

Проверьте это:

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

6 голосов
/ 06 июня 2011

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

if (strlen(session_id()) < 1) {
    session_start();
}
5 голосов
/ 07 февраля 2015

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