PHP 세션이 이미 시작되었는지 확인


461

때로는 세션을 시작한 페이지와 세션이 시작되지 않은 페이지에서 호출되는 PHP 파일이 있습니다. 따라서이 session_start()스크립트를 사용할 때 "세션이 이미 시작되었습니다"라는 오류 메시지가 표시되는 경우가 있습니다. 이를 위해 다음 줄을 넣었습니다.

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

그러나 이번에는이 경고 메시지가 나타납니다.

통지 : 정의되지 않은 변수 : _SESSION

세션이 이미 시작되었는지 확인하는 더 좋은 방법이 있습니까?

내가 사용 @session_start하면 제대로 작동하고 경고를 종료합니까?



Stackoverflow의 답변을 참조하십시오 : stackoverflow.com/questions/1545357/…
contact-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는 FIRST 시간 세션이 시작되는 것으로 설정되지만 세션이 닫힐 때 삭제되지 않습니다. 예를 들어, 스 니펫 이전에 session_start();session_write_close();다음 과 같은 코드가 있는 경우 : if 조건이 실패하지만 열린 세션이 없습니다 ...
Nicolò Martini

@Nicolo Martini 내가 이해하는 것처럼 : session_start()스크립트가 끝나면 스크립트 상단에서 시작된 세션이 닫히 거나 스크립트가 종료 session_write_closed()되기 전에 호출됩니다. 즉, 세션 쿠키에 데이터가 기록되고 세션이 'session_start'를 호출하는 다른 스크립트에 의해 액세스 될 수 있도록 닫히면 세션이 닫힙니다. 따라서 닫는다 고 세션이 삭제되었다는 의미는 아닙니다. 현재 스크립트를 종료하거나을 호출하여 세션을 닫고을 호출 session_write_close()하여 다시 열 수 있습니다 session_start(). 적어도 내 이해.
Stefan

1
여전히 세션을 시작하는 좋은 방법입니까? 링크이 대답에 관련된 아무것도 없기 때문에
csandreas1

@ csandreas1 링크에서 session_status에 대한 설명과 예상 반환 값을 볼 수 있습니다. 귀하의 질문에 대한 답변은 그렇습니다!
lovelyramos

나는 어떤 상황에서는 이것이 실패했습니다-나는 if (! isset ($ _ SESSION))를 성공으로 사용했습니다
Scott

161

PHP 5.4.0 이전의 PHP 버전 :

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

IMHO, 세션 시작 여부를 모르는 경우 세션 관리 코드를 리팩토링하는 것을 고려해야합니다 ...

즉, 내 의견은 주관적이며 세션이 시작되었는지 알 수없는 상황 (아래 예에 설명되어 있음)이 있습니다.


37
세션이 시작되었는지 알지 못하는 것이 반드시 나쁘지는 않습니다. 게으른 로딩 (세션이 처음 필요할 때만 세션 시작)이라면 답의 테스트가 완벽합니다.
drewm

1
또한 일부 환경에서 아파치는 세션 autostarting 설정 한
LeonardChallis

session_id ()가 포함 파일에 빈 문자열을 반환하는지 테스트하는 예제 :
tgoneil

3
tarted 여부를 모르는 경우 세션 관리 리팩토링에 대한 의견은 실제로 관련이 없습니다. 예를 들어 고급 기능을 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부터 새로운 메소드를 사용할 수 있다는 것을 아는 것이 좋습니다.
로건

1
이것은 이것을 확인하는 훨씬 더 좋은 방법입니다. 특히 사용자가 쿠키를 사이트를 탐색하는 중에 쿠키를 지울 때 세션이 시작되었는지 항상 알 수있는 것은 아닙니다 ... 나는 항상 2 살짜리 코드를 사용합니다. 사용자가 무엇을 할 것인지 전혀 모른다 ;-) 나 자신에 관해서는 변수와 기타 정보를 설정하기 위해 모든 스크립트에서 호출되는 작은 Config.php 파일이 있으므로 해당 파일에 추가하면 항상 세션이 시작됩니다. 그것은 필요하다
Andy Braham

35

이 작업을 수행 할 수 있으며 정말 쉽습니다.

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

그것이 도움이되기를 바랍니다 :)


6
@ zloctb : 내가 할 상황을 생각할 수 없으므로이 $_SESSION=array();대답은 괜찮아 보입니다.
7

5
@halfer Ryan의 답변을 참조하십시오. 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

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


6

session_id ()를 사용 하면 설정되지 않은 경우 빈 문자열을 반환합니다. 를 확인하는 것보다 더 안정적 $_COOKIE입니다.

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


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

이것은 내가 수년간 유물을 사용했던 것입니다. 이것을 사용하지 말라고 조언하는 사람이 있습니까? 물론 세션이 때때로 시작되는 경우 검사를 사용하는 것이 좋습니다. 일부 환경에서는 아파치에 세션 자동 시작 설정, 지연 로딩 (처음 필요할 때만 세션 시작) 또는 단순히 빠른 해킹을해야하는 경우가 있습니다
K Kilian Lindberg

위와 같은 반응을 보입니까 (@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

@ 함수 호출 전에 함수 호출 중에보고 될 수있는 오류를 억제합니다.

@before를 추가하면 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 문을 넣지 않으면 세션이 시작되지 않을 것입니다.


1

@Meliza Ramos 응답 (첫 번째 응답 참조) 및 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();
    }
}

실제로, 해결 된대로 여기에 설명하기에는 너무 늦었습니다. 이것은 요리를 선택하고 주문을 제거 / 추가 또는 변경하여 식당 메뉴를 구성하는 내 프로젝트 중 하나의 .inc 파일입니다. 내가 일하고 있던 서버에는 실제 버전이 없었기 때문에 더 유연하게 만들었습니다. 사용하고 사용해 보는 것은 저자의 몫입니다.


1

이 코드 스 니펫이 효과가 있습니까?

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

0

session_start()페이지 실행 당 정확히 한 번만 호출하도록 코드를 재구성해야합니다 .


4
일부 상황에서는 페이지 실행 당 정확히 한 번만 호출하는 것이 바람직하지 않을 수 있습니다.
Timo Huovinen

세션을 다시 작성하기 위해 세션을 종료하는 경우에는 특별한 경우입니다. 일반적으로 응용 프로그램은 세션이 처음 시작될 때 실행되는 코드를 가지고 있어야합니다.
SamT

1
예를 들어, 응용 프로그램은 파일에 세션을 저장하고 2 개의 동시 느린 데이터 요청을로드해야하지만이 요청 중 어느 것도 세션이 필요하지 않지만 session_start가 세션 파일을 잠그기 때문에 다른 요청을 차단합니다.
Timo Huovinen

바로 그거죠. @YuriKolovsky가 맞습니다. Alex의 질문은 이러한 경우가 발생할 수 있기 때문에 적절하며 드문 일이 아닙니다.
Paulo Coghi – 복원 모니카

14
-1, 대부분의 웹 사이트는 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

나는 상태를 다시 확인했다. PHP 5.4 이상

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

0

다음 솔루션을 사용하여 PHP 세션이 이미 시작되었는지 확인할 수 있습니다.

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

유효한 답변이 더 자세합니다.
Clément Prévost

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.