이미 시작된 PHP 세션


81

PHP 코드에서 세션이 이미 시작된 상태에서 새 세션을 시작하려고하면 다음과 같은 알림이 표시됩니다.

주의 : 세션이 이미 시작되었습니다-session_start () 무시

이것을 어떻게 피할 수 있습니까?


3
이전 세션이 실행중인 경우 새 세션을 시작하지 않습니까?
Madara의 유령

세션이 활성 상태인지 확인하는 방법의 중복 가능성 이 있습니까? -질문하기 전에 검색을 이용하세요.
hakre

세션이 벌써 시작되면 나에게는, 때 session_start ()를 제거하여 단순히 일을 왜 우리가이 코드에 포함 된 단지 config.php 파일이었다 내 경우 다시 운동을 시작해야 할
Mangesh Sathe

session_start()내 포함 중 하나와 require_once필요한 모든 파일에 넣었 습니다 .
누르 치

답변:


245

시험

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

이렇게하면 마스터 페이지를 사용하여 모든 콘텐츠를 래핑하는 경우 보안을 더 쉽게 구현할 수 있습니다.
Raymond Wachaga

이것은 또한 session_start ()가 포함 된 파일을로드 할 수도 있고로드하지 않을 수도있는 경우에 권장되므로 좋은 표준 관행입니다
Steve Whitby

29

새 것을 원하면 session_destroy()시작하기 전에 수행 하십시오. 시작하기 전에 설정되었는지 확인하려면 다음을 호출하십시오 session_status().

$status = session_status();
if($status == PHP_SESSION_NONE){
    //There is no active session
    session_start();
}else
if($status == PHP_SESSION_DISABLED){
    //Sessions are not available
}else
if($status == PHP_SESSION_ACTIVE){
    //Destroy current and start new one
    session_destroy();
    session_start();
}

나는 글로벌 체크 피할 것 $_SESSION대신 내가 부르고 session_status()PHP가 명시 적으로이 기능을 구현하기 때문에 방법 :

새로운 기능인 session_status를 통해 세션 상태를 노출합니다. 이것은 (PHP> = 5.4.0)입니다.


5

이전 세션을 삭제하려는 경우에만 :

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

또는 사용할 수 있습니다

unset($_SESSION['variable_session _data'])

특정 세션 변수를 파괴합니다.


4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

닫힌 게임


2

예,을 확인하여 세션이 이미 실행 중인지 감지 할 수 있습니다 isset($_SESSION). 그러나 가장 좋은 대답은 단순히 session_start()두 번 이상 전화하지 않는 것입니다.

스크립트의 아주 초기에, 아마도 첫 번째 줄에서도 호출되어야하며 다시 호출되지 않아야합니다.

코드의 여러 위치에있는 경우 이러한 종류의 버그를 요청하는 것입니다. 한 곳에만 있고 한 번만 호출 할 수 있도록 잘라냅니다.


1

이미 세션 시작을 호출해야 포함을 통해 다시 호출 될 수 있습니까?

if( ! $_SESSION)
{
    session_start();
}  

1
조금 늦었지만 어떤 이유로 든 작동하지 않습니다. (! isset ($ _ SESSION)) 만 작동합니다.
Mave

2
이것을 해고 할 위험 : Notice: Undefined variable: _SESSION. isset대신 사용하십시오 .
T30 2015

1

$ _SESSION의 차단 동작을 수정하는 동안이 문제가 발생했습니다.

http://konrness.com/php5/how-to-prevent-blocking-php-requests/

세션 파일은 스크립트가 완료되거나 세션이 수동으로 닫힐 때까지 잠겨 있습니다.

따라서 기본적으로 페이지는 읽기 전용 모드로 세션을 열어야합니다. 그러나 읽기 전용으로 열리면 쓰기 모드로 전환하려면 닫았다가 다시 열어야합니다.

const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;

/**
 * Open _SESSION read-only
 */
function OpenSessionReadOnly() {
    session_start([
                      'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
                      'read_and_close'  => true,    // READ ACCESS FAST
                  ]);
    // $_SESSION is now defined. Call WriteSessionValues() to write out values
}

/**
 * _SESSION is read-only by default. Call this function to save a new value
 * call this function like `WriteSessionValues(["username"=>$login_user]);`
 * to set $_SESSION["username"]
 *
 * @param array $values_assoc_array
 */
function WriteSessionValues($values_assoc_array) {
    // this is required to close the read-only session and 
    // not get a warning on the next line.
    session_abort();

    // now open the session with write access
    session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);

    foreach ($values_assoc_array as $key => $value) {
        $_SESSION[ $key ] = $value;
    }
    session_write_close();  // Write session data and end session

    OpenSessionReadOnly(); // now reopen the session in read-only mode.
}

OpenSessionReadOnly();  // start the session for this page

그런 다음 값을 쓰려고 할 때 :

WriteSessionValues(["username"=>$login_user]);

이 함수는 더 효율적으로 만들기 위해 key => value 쌍의 배열을 사용합니다.


0

이 시도

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

ob_start (); 사용하는 것이 좋습니다. sesson varriable을 시작하기 전에 브라우저 버퍼를 지정해야합니다.

편집 : $ _SESSION 뒤에 추가)


0

$ Session 변수에 의존하는 모든 PHP 파일에서 session_start ()를 호출하지 않고서는 위의 어느 것도 적합하지 않았습니다. 통지는 매우 성가 시며 Error_log를 빠르게 채 웁니다. 내가 찾을 수있는 유일한 해결책은 이것입니다 ....

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

잘못된 수정이지만 작동합니다.


0

더 효율적입니다.

@session_start();

화면에서 오류 처리기 방지

베스트,


0
<?php
if ( session_id() != "" ) {
    session_start();
}

기본적으로 다른 세션을 만들기 전에 세션이 시작되었는지 확인해야합니다. ... 더 많은 읽기 .

반면에를 사용하여 다른 세션을 만들기 전에 기존 세션을 삭제하도록 선택했습니다 session_destroy().


0

간단히 if 문 사용

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

또는

현재 세션 상태를 반환하는 session_status로 세션 상태를 확인하고 현재 세션이 이미 작동 중이면 세션이 작동하지 않으면 아무것도 반환하지 않고 세션을 시작합니다.


session_status() === PHP_SESSION_ACTIVE ?: session_start();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.