2009-06-16 3 views
3

필자는 스크립트 실행 중 PHP 세션이 시간 초과되는 경우 스크립트 실행이 끝날 때까지 $ _SESSION 배열의 내용을 계속 사용할 수 있을지 궁금해했습니다. 예를 들면 :

session_start(); 

if(! isset($_SESSION['name'])) { 
    echo 'Name is not set'; 
    exit; 
} 

// imagine there is a bunch of code here and that the session times out while 
// this code is being executed 

echo 'Name is ', $_SESSION['name']; // will this line throw an error? 

는 세션 시간 동안 밖으로 계속 확인하지 않고 내가 스크립트에서 나중에 읽을 수 있도록 로컬 범위에 세션 변수를 복사하는 것이 실용적인가? 예 :

session_start(); 

if(isset($_SESSION['name'])) { 
    $name = $_SESSION['name']; 
} else { 
    echo 'Name is not set'; 
    exit; 
} 

// bunch of code here 

echo 'Name is ', $name; 

답변

7

그런 것들에 대해 걱정하지 마십시오. 세션에는 아무 것도 일어나지 않을 것입니다. sessioni_start()$_SESSION으로 초기화되며 스크립트 내에서 항상 사용할 수 있습니다.

+0

심지어 기본 flatfile 구현은 gc가 실행되기 전에 파일이 열리고 잠겨 있기 때문에 요청한 세션이 시간 초과되는 것을 방지합니다. 따라서 gc가 session_start()를 호출하여 트리거 된 경우에도 매우 오래된 세션 파일을로드 할 수 있습니다. – VolkerK

0

이해해야 할 사항은 세션의 작동 방식입니다. $ _SESSION 수퍼 글로벌을 사용하여 스크립트에 액세스하는 클라이언트는 쿠키에 속한 세션의 키 (쿠키에 저장 됨/URL) 만 알고 있습니다. 이는 세션 데이터 자체가 클라이언트와 아무 관련이 없음을 의미합니다. 세션 데이터에 대한 키가 있으면 사용할 수 있습니다. 이전 버전의 PHP에는 세션이 쉽게 액세스 할 수있는 곳에 저장되어 있기 때문에 보안상의 문제가있었습니다 (세부 정보는 기억하지 않습니다).

기본적으로 PHP 스크립트에 세션 ID가 있으면 컴퓨터의 메모리가 플러시/harddrive가 손상되지 않는 한 해당 세션에 액세스 할 수 있습니다 (예 : 컴퓨터 다시 시작/장치 오류).

희망이 있으면 도움이 될 것입니다. 그렇지 않으면 php.net으로 이동하여 세션 작동 방식에 대해 자세히 알아보십시오.

2

기본 3 시간 세션 수명은 사용자가 세션을 열 때마다 재설정되므로 (session_cache_expire 참조) 요청이 처리되는 데 시간이 걸리는 유일한 방법은 요청을 처리하는 데 3 시간이 걸리는 경우입니다. 기본적으로 PHP 요청은 단 30 초 만에 시간 초과되므로 요청하는 동안 세션이 만료 될 위험이 없습니다. 또한 $_SESSION 변수가 갑자기 요청 중에 변경되지 않습니다. 세션이 시작되면 채워집니다.

2

변수는 초기 요청시 $ _SESSION 글로벌에 복사되므로 로컬 변수에 복사하는 것과 동일한 효과가 있습니다.

그러나 명확하게는 로컬 변수에 복사하는 것이 좋습니다. 특히 변수를 여러 번 사용할 계획이라면 $ _SESSION [ 'variable']이있는 코드를 읽기가 어려울 수 있습니다.