나는 그것이 합리적이라고 생각하지 않는다.ob_start()가 session_start()보다 PHP에서 작동해야하는 이유는 무엇입니까?
왜 실제로 그러한 규칙입니까? 도 arround를 다른 방법 -은 "일반적인 경우"나는 ob_start
이 session_start
전에 호출 할 수 있다고 생각하지 않습니다에서
나는 그것이 합리적이라고 생각하지 않는다.ob_start()가 session_start()보다 PHP에서 작동해야하는 이유는 무엇입니까?
왜 실제로 그러한 규칙입니까? 도 arround를 다른 방법 -은 "일반적인 경우"나는 ob_start
이 session_start
전에 호출 할 수 있다고 생각하지 않습니다에서
.
그래도 manual page of session_start
을 인용 : 트랜스 SID가 활성화되면 재기록 URL 내부 출력 핸들러를 등록한다
으로 session_start을(). 사용자가 ob_gzhandler를 사용하거나 ob_start()와 같은 경우 출력 핸들러의 순서는 적절한 출력을 위해 이 중요합니다. 예 : 의 경우 세션 시작 전에 ob_gzhandler를 등록해야합니다.
그러나 이것은 출력 핸들러의 순서가 중요하다는 것을 의미합니다. 한 핸들러가 다른 핸들러를 수정하도록하려면, 다른 핸들러에서 수정해야합니다. "올바른 순서. 당신이 핸들러 그런 종류의 사용하지 않는 (아파치를하고 출력을 압축에 관해서 mod_deflate
는 예를 들어, 좋은 일을 할) 경우
일반적으로, 중요한 유일한 것은 헤더가 아니어야한다는 것입니다 session_start
(구성에 따라 session_start
은 HTTP 헤더로 전달되는 쿠키를 전송하기 때문에)을 호출하기 전에 전송됩니다.
그리고 헤더 데이터의 조각으로 즉시 전송은 전송되어야한다 - 즉, 즉시 모든 출력, <?php ?>
태그 밖에서도 하나의 공백이 같이
참고 : 당신이 경우 쿠키 기반 세션을 사용하는 경우 브라우저에 이 출력되기 전에 session_start()를 호출해야합니다. 이 함수는 버퍼링 출력 바뀔 것이다
:
은 PHP가 데이터를 버퍼링하는 것을 나타낸다. 출력 버퍼링이 활성화되어 있지만 스크립트 (헤더 제외)에서 출력이 보내지지 않는 대신 출력은 내부 버퍼에 저장됩니다.
ob_start
실제로는 "데이터 보내기"이라고 말하기 전에 출력이 전송되지 않습니다. 즉, 헤더는 즉시 전송되지 않습니다. 즉, ob_start
을 사용하지 않은 경우 나중에 출력 할 수 있더라도 session_start
을 나중에 호출 할 수 있습니다.
희망 사항으로 인해 상황이 좀 더 명확 해집니다.
기본적으로 output_buffering
이 Off
이며 다음 HTTP
헤더가 이미 전송 된 클라이언트에 다시 데이터의 단일 바이트를 보낼 수있을만큼 불행한 경우. session_start()
이 쿠키 헤더를 다시 클라이언트로 전달하지 못하게합니다. ob_start()
을 호출하면 버퍼링이 활성화되므로 http 헤더를 보내는 데 시간이 걸립니다.
session_start
특정 구성 옵션이 설정된 경우 HTTP 헤더를 수정할 수 있습니다. 예를 들어, session.use_cookies은 Set-Cookie 헤더 필드를 설정/수정해야합니다.
HTTP 헤더를 수정하려면 HTTP header이 첫 번째 출력이 전송되기 전에 전송되므로 클라이언트에 이미 전송 된 결과가 없어야합니다.
따라서 session_start
을 호출하기 전에 출력이 전혀 출력되지 않도록해야합니다. 또는 이미 출력 된 경우에도 HTTP 헤더를 수정할 수 있도록 output buffering control을 사용하여 출력을 버퍼링합니다.
session_start()
은 trans-sid
이 활성화 된 경우 URL 재 작성을위한 내부 출력 처리기를 등록합니다. 사용자가 등을 ob_start()
과 같이 사용하는 경우 적절한 출력을 위해서는 출력 핸들러의 순서가 중요합니다.
예를 들어, 사용자는 세션 시작 전에 ob_gzhandler
을 등록해야합니다.
그러나 이것은 특별한 경우입니다. 여기서, 출력 핸들러의 순서가 중요하다는 것이 여기 있습니다. 한 핸들러가 다른 핸들러를 수정하도록하려면 "올바른"순서로 실행해야합니다. 당신은 핸들러의 종류 사용하지 않는 (아파치를하고, 예를 들어, 출력을 압축에 관해서 mod_deflate
은 훌륭한 일을 할) 경우
일반적으로, 중요한 유일한 것은 당신이 호출하기 전에 헤더가 전송되지해야한다는 것입니다 session_start
(구성에 따라 session_start
은 HTTP 헤더로 전달되는 쿠키를 전송하기 때문에).
그리고 헤더 데이터의 조각으로 즉시 전송은 전송되어야한다 - 즉, 즉시 모든 출력, <?php ?>
태그 밖에서도 하나의 공백이 같이
참고 : 당신이 경우 쿠키 기반 세션을 사용하는 경우 브라우저에 무엇인가 출력되기 전에 session_start()
으로 전화해야합니다.
이 함수에서 출력 버퍼링을 설정한다 :
ob_start
이렇게하면 실제로 "데이터 보내기"라고 말하기 전에 출력이 전송되지 않습니다. 이것은 헤더가 즉시 전송되지 않는다는 것을 의미합니다. 즉, ob_start
이 사용되지 않았 으면 출력되어야 할 경우에도 나중에 session_start를 호출 할 수 있습니다.
session_start(); 헤더를 보내기 전에 호출해야합니다. ob_start()는 잠시 출력을 억제하므로이 규칙을 위반할 수 있습니다.일반적으로 상단의 ob_start()는 알 수없는 것을 디버깅 할 때를 대비 한 빠른 수정입니다. 아래의 모든 것은 예상대로 작동합니다 (작성된 것만 제외하고 ;-)). 나중에 ob_start()를 session_start()에 사용하는 것을 선호합니다.
솔직히 말하면 : 나는 그런 규칙을 듣지 못했습니다! – mauris