2012-11-06 2 views
0

내 스크립트는 새로운 PHP 세션을 생성하고 즉시 다른 페이지로 사용자를 리디렉션합니다.첫 번째 로그인 시도에서 PHP 세션이 실패 할 수있는 원인은 무엇입니까?

이 기능은 서버가 1 시간 정도 유휴 상태가 된 후에 처음 사용할 때를 제외하고는 항상 완벽하게 작동합니다. 두 번째 시도에서 그리고 그 후에 그것은 완벽하게 다시 작동합니다. 서버가 유휴 상태가되면 항상 실패하고 첫 번째 시도 후에는 항상 작동합니다.

서버가 유휴 상태이면 세션이 작동하지 않습니다. 그 후 모든 것이 잘 작동합니다.

이론적으로 세션이 첫 번째 시도에서 실패 할 수있는 원인은 무엇입니까?

게시 할 코드 부분을 모르므로 여기에 코드를 게시하고 싶지 않습니다. 이것은 PHP 5.3이 설치된 IIS 7에 있습니다. CGI와 FastCGI를 사용하는 경우에도 같은 결과가 나타납니다.

편집 session_start(); 두 스크립트 모두에서 호출됩니다. 사용자는 즉시 다음 페이지로 리디렉션 될 때 첫 번째 페이지를 보지 않습니다. 스크립트 사이에 1 초도 채 걸리지 않습니다.

+0

나는 코딩/로직 오류라고 말하고 코드를 보지 않고는 정말로 대답 할 수 없다. 많은 추측을 할 수있다. – newfurniturey

+0

"* 서버가 1 시간 정도 유휴 상태입니다 *"라고 말하면 브라우저에 웹 페이지를로드하고 로그인을 시도하기 전에 * 1 시간 정도 * 앉아 있다고 가정합니까? – newfurniturey

+0

나는 @newfurniturey와있다 : 몇 가지 코드를 보여라. 내 첫 번째 추측은 당신이'$ _SESSION' super-global에 접근하려하지만 세션이 만료되었다는 것입니다. 어떤 코드를 보여주고 여러분이 시도한 것을 말해 줌 –

답변

1

PHP 세션의 시간이 초과되었습니다 (귀하의 질문을 정확하게 이해할 수있는 경우). 즉, 시간 초과 후 "재설정"됩니다.

당신은 php.ini 파일에 session.gc_maxlifetime을 확인할 수 있습니다 :) 내가 제대로 이해하지 않은 경우

가, 다음이 코드 자체에 오류가있을 수 있습니다.

+0

서버의 ini 파일을 편집하고 싶지 않으면'htaccess' 파일에서'php_value session.gc_maxlifetime'을 사용할 수도 있습니다. – James

+2

세션 타임 아웃은 OP의 문장에 적용될 때 실제로는 이해가되지 않습니다. 그는 사용자가 처음 로그인 할 때 세션이 * new *임을 나타내는 것은 작동하지 않는다고 말합니다. 물론, 나는 또한 그의 "서버가 유휴 상태"라는 문장으로 혼란 스럽다. 그래서 누가 알 수있다. – newfurniturey

+0

__ "이 기능은 서버가 1 시간 정도 유휴 상태가 된 후에 처음 시작할 때를 제외하고는 항상 완벽하게 작동합니다."__ - 서버가 유휴 상태가 된 후에 만 ​​처음 실패합니다. 이 인용문은 타임 아웃 문제 일 수 있다고 생각하게 만들었습니다. – Prash

2

세션이 디스크에 저장됩니다. 아무런 활동이 없기 때문에 서버의 디스크가 회전 할 수 있습니다. 그런 다음 디스크가 회전하기 전에 스크립트가 시간 초과됩니다. 가능한?

+0

제안 해 주셔서 감사합니다. 나는 그것을 시도했다. 불행히도 그것은 문제를 해결하지 못했습니다. 나는 디스크에 세션을 시간 내에 기록 할 수없는 것과 관련이 있다고 생각하고 있었다. (전체 프로세스는 두 번째이다.) – Tom

0

내 스크립트는 새로운 PHP 세션을 만들고 즉시 다른 페이지로 리디렉션합니다.

나는 단어는 의미로 해석 : 1 페이지를 당신이 session_start()header('Location: 'page2.php')을 실행하고 있지만, 페이지 2에 당신이 다시 session_start() 일을하지 않는 날 것으로 보인다.

$_SESSION을 사용할 모든 페이지에서 session_start()가 필요합니다. 즉, 모든 PHP 페이지의 맨 위에 또는 모든 페이지에서 실행할 계획 인 포함 파일 내에 session_start()을 배치하십시오.

0

내 질문에 답하십시오. 그것이 밝혀 졌을 때 그것은 포함 된 모듈 중 하나에있는 오래된 "기능"때문이었습니다. 이 "기능"은 세션이 한 시간 이상 열려 있다면 session_destroy()를 호출하여 세션을 종료하도록 설계되었습니다.

이로 인해 사용자가 로그인을 시도하면 PHP는 이전 세션을 인식하고 session_destroy()를 호출합니다. 이 모든 것이 잘된 것 같았지만 새로운 세션 변수를 세션에 쓸 수 없었습니다. PHP 로그에 문제가 있다는 징후가 없습니다.

session_destroy를 session_unset으로 변경하면 문제가 해결됩니다.

관련 문제