2010-07-23 4 views
0

세션에 저장된 PHP 개체를 수정하는 동시 AJAX 요청을 만드는 데 특이한 문제가 있습니다. 경쟁 조건에 문제가 있지만 그 이유를 이해할 수 없습니다. 한 번에 하나의 AJAX 호출 만 열 수 있으므로 수정하는 동안 세션을 계속 열어두면 각 세션을 열어서는 안됩니다. 다른 사람들이 변경 한 사항을 볼 수 있어야합니까? 다음은 플로우의 단순화 된 버전입니다 (A와 B는 두 세트의 매개 변수입니다).동시 AJAX 요청 및 PHP 세션

1) Initiate (A)를 실행하는 AJAX 호출이 작성됩니다. 이 호출은 세션을 엽니 다. 배열에 "A - Running"을 추가하여 PHP 객체를 업데이트합니다.
2) Run (A)에 대한 AJAX 호출이 생성됩니다. Initiate (A)가 세션을 닫고 실행될 때까지 대기합니다. 세션을 잠깐 열지 만 명시 적으로 세션을 닫고 개체를 수정하지 않습니다. 실행 (A)는 실행하는 데 최대 60 초가 걸립니다.
3) Initiate (B)를 실행하는 또 다른 AJAX 호출이 생성됩니다. 그러면 세션이 열리고 배열에 "B-Running"을 추가하여 개체를 수정합니다.
4) Run (B)에 또 다른 AJAX 호출이 수행됩니다. 세션을 잠깐 열지 만 명시 적으로 닫습니다.

지금까지 모든 것이 훌륭합니다. 실행 (A)과 실행 (B)가 모두 실행 중입니다. "A - 실행 중"과 "B - 실행 중"은 객체 배열에 있으며 두 요청 중 열려 있지 않은 세션에 저장됩니다. 여기에 어떤 일들이 웃기는 일이 있습니다 :

5) 실행 (A)가 먼저 실행되고 Show (A)가 실행되는 AJAX 호출이 이루어집니다. 세션을 열고 개체를 검색 한 다음 "A - Running"을 "A - Complete"로 변경합니다. 재미있는 점은 "달리기 - B"가 전혀 없다는 것입니다.
6) Run (B)가 끝나면 Show (B)를 실행하는 AJAX 호출이 이루어진다. 그러면 세션이 열리고 객체가 검색됩니다. "B - Running"을 "B - Complete"로 변경합니다. 그러나 배열의 첫 번째 요소는 "A - Running"입니다.

세션을 닫고 저장하면 Show (A)가 열리면 Initiate (B)의 변경 사항을 볼 수없는 이유는 무엇입니까? 그리고 Initiate (B)가 Initiate (A)의 변경 사항을 명확하게 볼 수 있지만 Show (A)가 수행 한 내용을 볼 수없는 경우 ...

이전에 Run (B) 실행 (A).

+0

디스크의 파일을 사용하는 기본 세션 핸들러 대신 자신의 세션 핸들러를 사용하고 있습니까? – Charles

+0

우리는 외부 프레임 워크 (eyeOS)를 사용하고 있지만 session_set_save_handler에 대한 코드는 어디에도 없습니다. 거기에 사용자 지정 세션 처리기를 사용할 수있는 다른 방법은 없습니까? 또한/tmp/sess_ (내 session_id) 서버에서 볼 수 있습니다. – Derek

+0

파일 기반 세션 시스템을 사용하고있을 가능성이 있습니다. 이것이 맞춤 세션 핸들러와 데이터베이스 잠금의 경우 인 것처럼 들렸지 만 지금은 확실하지 않습니다. – Charles

답변

1

eyeOS 프레임 워크와 관련이있는 것으로 보입니다. 내 Run 함수의 시작 부분에 session_write_close()를 실행 한 이후처럼 보입니다. 내 Run 함수가 끝날 때 session_start()를 사용해야합니다. 그렇지 않으면 eyeOS가 올바르게 정리할 수 없습니다.

저는 3 일 동안 계속 켜고 있습니다. 이야기의 도덕 : 개발을 위해 eyeOS를 사용하지 마십시오!