2015-01-12 2 views
0

필자는 복잡하고 긴 MySQL 작업을 수행해야하는 인트라넷 사이트를 보유하고 있으며 이러한 일이 발생하는 동안 PHP 세션 시간 초과를 방지 할 수있는 방법을 찾아야합니다.긴 ajax 호출 중에 PHP 세션 시간 초과를 방지하려면 어떻게합니까?

PHP 페이지에는 사용자가 작성할 수있는 모든 양식 데이터가 있습니다. 사용자가 제출 버튼을 누르면 Ajax 호출이 해당 데이터와 함께 종료되고 Ajax 호출은 작업이 완료 될 때까지 대기 한 다음 결과를 사용자에게 알립니다. 이 통화가 진행되는 동안 사이트가 시간 초과되지 않도록해야합니다.

첫 번째 생각은 setInterval을 사용하고 세션을로드하고 일부 데이터를 새로 고치는 페이지에 두 번째 ajax 호출을 실행하는 것이었지만 첫 번째 테스트에서 두 번째 호출과 첫 번째 호출이 완료 될 때까지 추가 호출이 응답되지 않았습니다. (필자는 첫 번째 호출에서 PHP를 사용하여 기다림을 시뮬레이션했습니다.) 필자의 스크립트는 몇 가지 새로운 Ajax 호출 (Firebug에서 본)을 시작했지만 첫 호출이 완료 될 때까지 기다렸습니다. 그때까지 서버에서 응답이 없었습니다. 나는 서버가 단순히 첫 번째가 완료 될 때까지 동일한 클라이언트로부터의 두 번째 호출을 무시한다고 생각한다. 나는 PHP가 sleep이 끝나기를 기다리고 있기 때문에 아파치가 호출을 수락하는 것을 의심한다 ...

내 연구 중에 나는 어떤 사건이 세션 타임 아웃을 고려했는지 아직 알지 못했다. 한 페이지는 Ajax를 사용하여 그림을로드하는 것만으로도 Session 시간이 연장 될 것이라고 주장했지만, PHP가 포함되지 않았기 때문에 나에게 맞지 않습니다. 게다가 서버가 두 번째 연결을 허용하지 않으면 ' 일하지 마라. 또 다른 페이지는 세션 변수 데이터가 쓰여질 때마다해야한다고 말했지만 로그인 도중 작성하는 페이지가 많기 때문에 내 경험에 맞지 않습니다.

그래서 제 질문은 두 가지이다 :

정확한 이벤트가 세션이 "시간 초과"로 간주 될 때까지 주어진 제한 시간 내에 일이 발생 여부를해야
  1. ? 브라우저에 쿠키 타임 아웃과 PHP의 세션 타임 아웃과 같은 두 개의 타이머가있는 것으로 추측됩니다. 그러나 이것들은 추측 일 뿐이며 이에 대한 전문가의 의견을 듣고 싶습니다.

  2. 내가 유지할 수있는 방법이 세션 프로세스가 아직 살아 일 동안? 이 과정은 한 시간 이상 걸릴 수 있습니다. 이 사이트는 인트라넷 사이트이며 네트워크 외부에서 액세스 할 수 없기 때문에 보안은 큰 문제는 아니지만이 세션 외부에서 정기적 인 세션 제한 시간을 설정해야합니다.


OK, 나는 여기서 명확히 할 필요성을 느낍니다.

는 내가 PHP의 세션 시간 제한이 관련 될 때마다 서버의 배후에 어떤 일이 벌어지는 지 알아 알아 내기 위해 노력하고 있어요.

예 : PDF 파일을 만드는 데 1 시간이 걸리지 만 시간 초과가 30 분으로 설정된 스크립트가있는 경우 사용자/브라우저/마우스가 활성 상태가 아니거 나 제한 시간 초과로 인해 시간 초과가 발생합니다 스크립트가 아직 실행 중이기 때문에 트리거 될 수 있습니까? 어떤 이벤트가 시간 초과되기 전에 세션을 연장에서 발생 (생성 된 사용자와 서버) 걸릴 - 나는 정확히 무슨 일입니다 알고 싶습니다 무엇

?

PHP 설정에 대해 하루 종일 알 수 있으며 어떤 일이 발생하는지 아직 알 수 없습니다.

의는 지금까지의 내가 그들을 이해로 기본부터 시작하자 :

전형적인 세션이 세션을 보유하고있는 클라이언트 브라우저에서 서버, 세션 ID, 종종 쿠키에 세션 파일에서 구성 될 수

id 및 타임 스탬프.

서버의 세션 파일이나 세션 파일의 일부 인덱스에도 타임 스탬프가 포함되어 있다고 가정합니다.

어떤 이벤트로 인해 이러한 타임 스탬프가 업데이트되고 이러한 타임 스탬프 중 어떤 타임 스탬프가 타임 아웃되었는지를 결정하는 데 사용됩니까? 서버가 세션의 시간 초과 여부를 결정하기 위해 쿠키의 만료 날짜를 테스트하는 것을 볼 수 있지만 서버 정보에 의존하는 것이 더 안전합니다.

내가 찾는 정보 유형입니다.

어쩌면 원래 질문을 닫고이 정보가 포함 된 새 질문을 작성해야합니다. 여기에 제안 사항이 있습니다. 원래 게시물을 쓸 때 프로젝트에 대한 답변이 필요했지만 백그라운드에서 작동하는 것을 알기 전까지는 프로세스를 완전히 이해하지 못한다는 사실을 깨달았습니다.

+1

가능한 중복 (http://stackoverflow.com/questions/6360093/how [세션의 수명을 설정하는 방법] 설정 수명 - 세션 시간) –

+0

당신은 바퀴를 재발 명하고 있습니다. 세션 수명을 기본값보다 길게 만드십시오. –

+1

그래서, 처리하는 데 30 분이 걸리는 아약스 전화가 있습니까? 나에게 나쁜 생각처럼 들린다. 특히 사용자가 실제로 응답을 기다리는 경우! – developerwjk

답변

0

먼저 세션이 살아 있는지 사용자가 활성화되어있는 동안 (클래식 링크 또는 ajax로 인트라넷을 탐색 할 때 아파치 서버가 구별 할 수 없음) 먼저 알아야합니다.

사용자가 인트라넷에서 시간의 기간, 또는 분리 한 후 비활성화 될 경우

, 그래서 파괴됩니다 세션이 php.ini 파일에서 설정 한 매개 변수의 그쪽으로 값이됩니다 시간의 최소 :

session.gc_maxlifetime= TIME_IN_SECONDS 

는이 3 개 개의 매개 변수를 구성해야 제대로 세션 시간을 구성하려면 :

; Defines the probability that the 'garbage collection' process is started 
; on every session initialization. The probability is calculated by using 
; gc_probability/gc_divisor. Where session.gc_probability is the numerator 
; and gc_divisor is the denominator in the equation. Setting this value to 1 
; when the session.gc_divisor value is 100 will give you approximately a 1% chance 
; the gc will run on any give request. 
; Default Value: 1 
; Development Value: 1 
; Production Value: 1 
; http://php.net/session.gc-probability 
session.gc_probability=PROBA_CHANGEME 

; Defines the probability that the 'garbage collection' process is started on every 
; session initialization. The probability is calculated by using the following equation: 
; gc_probability/gc_divisor. Where session.gc_probability is the numerator and 
; session.gc_divisor is the denominator in the equation. Setting this value to 1 
; when the session.gc_divisor value is 100 will give you approximately a 1% chance 
; the gc will run on any give request. Increasing this value to 1000 will give you 
; a 0.1% chance the gc will run on any give request. For high volume production servers, 
; this is a more efficient approach. 
; Default Value: 100 
; Development Value: 1000 
; Production Value: 1000 
; http://php.net/session.gc-divisor 
session.gc_divisor=DIVISOR_CHANGEME 

; After this number of seconds, stored data will be seen as 'garbage' and 
; cleaned up by the garbage collection process. 
; http://php.net/session.gc-maxlifetime 
session.gc_maxlifetime= MAX_LIFE_TIME_CHANGEME 
+0

"사용자가 활성 인 동안"읽었지만 여전히 다소 모호합니다. 사용자가 마우스를 흔들면 PHP가 세션을 유지할 수 있을지 의심 스럽습니다. 나는 정확하게 timeout이 서버에서 나오는 파일,'session_start()','$ _SESSION'에서 데이터로드, 또는'$ _SESSION'으로 저장하는 것을 정확히 알아야합니다. – semmelbroesel

관련 문제