2011-12-22 2 views
0

ob_end_flush()은 암시적인 세션 닫기를 유발합니다. 이것은 의도 된 행동입니까? 나는 대답이 '예'라고 생각하지만, 어떻게 든 그것을 막을 수 있습니까?PHP : ob_end_flush() end session

여기에서 내가 직면 한 문제에 대한 설명입니다. 사용자 지정 세션 처리기를 사용하는 프레임 워크를 사용하고 있습니다.이 경우 중요하지 않다고 생각합니다. 실제 문제는 프레임 워크 코드 ob_end_flush()의 어느 시점에서 호출 될 때 발생합니다. 사용자 정의 세션 핸들러 호출을 로깅함으로써이 경우에 세션 쓰기 및 닫기가 호출되었음을 알 수 있습니다. Zend Debugger로 디버깅조차 할 수 없기 때문에 암시 적으로 error_log로만 기록하십시오. 그래서, ob_end_flush() 세션과의 상호 작용이 계속되면 (나도 알지만, 틀릴 수도 있지만 여전히 그렇다) 그 상황에서 이전 세션이 이미 닫혀있을 때 새로운 ID로 새로운 세션이 시작됩니다. 새로운 세션은 쿠키가 현재 설정되지 않았기 때문에 새로운 ID를가집니다. 결과적으로 두 개의 서로 다른 ID를 사용하여 두 개의 세션이 분리되었습니다.

나에게 가장 좋은 해결책은 암시 적으로 ob_end_flush() 동작을 비활성화하는 것이지만 모든 대답을 수락합니다.

미리 감사드립니다.

+1

'ob_end_flush()'는 세션을 종료하지 않습니다. 모든 프레임 워크 해결 방법을 사용하지 않고 작은 스크립트로 확인할 수 있습니다 – zerkms

+0

흠, 정말요? 그것을 확인해야합니다. 어쩌면 내가 잘못 이해하고 있지만 ob_end_flush()에서 중단 점을 설정하고 "step over"키를 누른 다음 새 세션 파일을 만든 직후에 (사용자 세션 write()를 수행하면됩니다). 그러나 디버거가 거기에 가지 않기 때문에 나는 write() 호출을 할 수 없다. 그래서 그것이 내재적이라고 생각했다. – Stranger

답변

0

약간 간접적 인 대답이지만 전체 요청을 버퍼링하는 목적으로 출력 버퍼를 시작하는 것이 일반적인 방법입니다. 이렇게하면 콘텐츠를 "출력"하기 시작한 후에도 계속 세션을 사용하거나 헤더 (리디렉션 포함)를 설정할 수 있습니다. 이것은 암시 적 세션 닫기 문제를 처리해야합니다. 부트 스트랩 상단에 ob_start() 전화를 추가하기 만하면됩니다.

+0

프레임 워크 코드에서 볼 수 있듯이, 이미 올바른 위치에서 ob_start()를 수행하고 전체 요청을 버퍼링합니다. Session_write_close()가 ob_end_flush()에서 한 번 호출되었고 요청 처리가 끝날 때 (실행 코드가 더 이상 없을 때) 문제가 발생했습니다. 위의 zerkms는 ob_end_flush()가 세션을 종료하지 않는다고 말하면, 그렇다면 약간 엉망이됩니다. – Stranger

+0

글쎄, 그것은 실제로 "일반적인 관행"이지만, 어떤 방법 으로든 권장 된 것이 아닙니다. 유일한 좋은 방법은 이유없이 출력을 수행하지 않는 응용 프로그램 디자인을 만드는 것입니다. –

+1

@ Col.Shrapnel, 불일치로 잘못된 것은 없지만 출력 버퍼링이 절대적으로 권장되는 몇 가지 사용 사례를 분명히 지적 할 수 있습니다. 나는 오히려 여기에 단지 하나의 우수 사례가 있다고 말한 것을보고 놀란다. 분명 모범 사례는 문맥에 따라 결정됩니다. – Kenaniah