2009-10-12 5 views
3

Zend Framework, jQuery의 ajax 및 Zend_Session을 사용하는 PHP 응용 프로그램이 있습니다. 이 응용 프로그램은 약 7 개월 동안 주변에 있고 그것이해야하는 방식대로 작동합니다. 사용자가 로그인 한 후 응용 프로그램이 초기화되면 대시 보드 유형 페이지에 관련 데이터를로드하기 위해 약 10 건의 아약스 요청이 해제됩니다. 요청이 완료된 후, Ajax 요청은 주로 그 시점부터 사용자가 시작합니다. 응용 프로그램이 제대로 작동하면 진정한 부하 분산 환경이 없었고 요청을 처리하는 3 개의 응용 프로그램 서버가 있었지만 각각은 PHP 세션 데이터를 로컬에 저장했습니다. 최근에 우리는 그것을 변경하여 각 애플리케이션 서버가 PHP 세션 데이터가 저장되는 중앙 NFS 공유에 연결되도록했습니다. 그 때 응용 프로그램이 고장났습니다.Ajax, PHP 및 세션 문제

이제 페이지가 초기화되고 대기중인 아약스 요청을 볼 수 있지만 그 중 절반은 시간 초과됩니다. 충분히 길게 (약 3-10 분) 기다리면 사용자가 시작한 모든 클릭이 빠르게 응답합니다. 문제가 세션 처리의 변경으로 인해 발생했음을 확인했습니다.

누구든지 무슨 일이 벌어지고 있는지, 문제를 해결하는 방법 및/또는 해결 방법에 대해 설명해 주시겠습니까?

당신이 줄 수있는 도움을 크게 주셔서 감사합니다. 나는 이걸로 머리카락을 뽑아왔다.

+0

"세션 변경의 변화"에 대한 자세한 내용을 알려주십시오. 이것은이 문제의 원인이되어야합니다. –

+0

내가 언급 한 변경 사항은 위에서 설명한대로 서버 당 로컬로 저장된 세션에서 세션의 중앙 NFS 저장소로 이동할 때입니다. – Bob

답변

2

이것은 일반적인 문제입니다. 세션 잠금 문제가 발생했을 가능성이 큽니다. PHP가 사용하는 기본 세션 저장 핸들러, 그리고 파일 핸들러 (그리고 기본적으로 Zend_Session이 사용하는 핸들러)는 flock() 시스템 콜을 사용하여 세션 파일을 잠급니다.

개별 HTTP 요청을 보낼 서버를 어떻게 선택합니까? 임의의 요청이고 모든 요청이 서버 중 임의의 서버에서 처리 될 수있는 경우 서버 1이 초기 요청을 처리하고 NFS 공유에 세션 파일을 만들고 잠금을 유지하는 시나리오를 쉽게 상상할 수 있습니다 그 파일.

다음 AJAX 요청은 다른 서버로 들어옵니다.이 서버의 PHP 프로세스는 클라이언트의 쿠키에서 세션 ID를 읽고 NFS 공유의 세션 파일에 대한 잠금을 얻으려고합니다. 첫 x 째 서 v는 여전히 파일에 대한 잠금을 가지고 있으 G로 잠겨 있으며 대기합니다.

그게 원인 일 수 있습니다. PHP로드 밸런싱을 시작할 때 꽤 일반적입니다.

일부로드 밸런서는 밸런서가 유선을 통해 세션 ID를보고 똑같은 물리적 서버가 주어진 세션에 대한 모든 요청을 처리 할 수있을 정도로 '고정 세션'을 제공하는 모드를 제공합니다. 로드 균형 조정의 효율성을 떨어 뜨릴 수는 있지만 문제를 해결하는 데는 가치가 있습니다.

또는 문제가 다른 것과 관련되어있을 수 있습니다. 나는 모른다.

+0

그것이 우리가 할 수있는 결론이지만, 우리는 100 % 확신하지 못했습니다. 옵션을 고칠 수 있는지 확실하지 않습니다. 나는 빠르고 쉬운 방법을 좋아하지만 앱의 좋은 부분을 재 설계해야 할 것 같다. – Bob

+0

이 사이트의 다른 게시물 중 하나에서 브라우저의 쿠키에 세션 데이터를 저장하는 작은 방법을 제안합니다. 가장 좋은 해결책은 서버 측 세션에 아무 것도 저장하지 않는 것입니다. 해당 답변에 대한 링크는 다음 페이지를 참조하십시오. http://stackoverflow.com/questions/617793/what-is-the-best-way-to-persist-an-object-using-forms-in-php/617915#617915 – RibaldEddie

2

몇 가지 문제가있을 수 있습니다.

  • NFS 공유를 noac 옵션으로 마운트하면 오래된 복사본 (What is close-to-open cache consistency?)을 방지 할 수 있습니다.
  • NFS는 (PHP 세션 문서를 확인) 프레임 셋을 사용하는 경우 문제를 제기하지만 서버의 로컬 메모리에
  • 가 알려져있다 기입 느린
  • 잠금 파일 (session_write_close()라고?) 여부를
  • 입니다 도메인을 변경하면 문제가 발생할 수도 있습니다 (a.domain.com, b.domain.com)