최근 한 웹사이트에 대한 설문 조사를 하던 중 ThinkPHP에서 쿠키와 세션 사이에 충돌이 발생하여 쿠키를 사용할 수 없는 문제가 발생했습니다.
이 웹사이트는 ThinkPHP 프레임워크를 사용하여 만들어졌습니다. 많은 사진을 표시하는 페이지가 있습니다. 각 사진에는 해당 투표가 필요하며, IP 주소를 제한하여 특정 시간 내에 방문자 수를 제한합니다. 범위에 있지만 각 사진은 한 번만 투표할 수 있습니다. 처음에는 IP를 사용하여 데이터베이스에 저장하여 해결되었습니다. 나중에 IP가 서비스 파일에 있지만 생성된 세션 ID가 필요합니다. ThinkPHP 매뉴얼의 지시에 따라 세션이 원활하게 진행되었으나 쿠키를 생성한 후 로컬 컴퓨터에서 쿠키 텍스트를 찾을 수 없습니다. 원래는 로컬 컴퓨터가 이를 제한한 것으로 생각했습니다. 쿠키를 생성하는데, 조회 및 테스트 결과 제한이 없는 것으로 나타나 별도의 PHP 파일을 생성하고, 생성된 쿠키를 테스트해 보니 문제가 없고, 쿠키 텍스트가 로컬에서 발견되어 다음과 같은 내용을 온라인에서 찾았습니다. 문제는 setcookie() 함수를 사용하여 쿠키를 설정하는 방식으로 순차적으로 해결되었으며 원하는 결과를 얻었습니다.
해결 방법은 다음과 같습니다.
php.ini 구성 파일을 찾은 다음 output_buffering 항목을 찾아 해당 값을 off에서 on으로 변경하고 Apache를 다시 시작하면 됩니다. 좋아요.
유사한 문제도 많이 있습니다.
원래 로컬에서 문제 없이 실행되었던 파일을 서버에서 테스트할 때 실제로 로컬에서는 나타나지 않는 오류가 표시되는 경우가 있습니다. 경고: 헤더 정보를 수정할 수 없습니다.
이러한 설명을 보면 그 원인이 setcookie에 의한 것임을 알 수 있습니다. 인터넷을 확인해 보면 다음과 같은 설명이 있습니다. 다음과 같은 쿠키 자체 사용:
1. setcookie를 호출하는 설명은 태그 앞에 배치되어야 합니다.
2. setcookie를 호출하기 전에는 Echo를 사용할 수 없습니다.
3. 쿠키는 태그에 표시되지 않습니다. 웹페이지가 다시 로드될 때까지 프로그램
4. setcookie 함수는 데이터가 브라우저에 출력되기 전에
을 전송해야 합니다. 위의 제한 사항에 따라 setcookie() 함수를 실행할 때 종종 "정의되지 않은 인덱스" 및 "헤더 정보를 수정할 수 없습니다" - 이미 보낸 헤더"... 및 기타 문제가 발생합니다. "헤더 정보를 수정할 수 없습니다 - 이미 보낸 헤더" 오류를 해결하는 방법은 데이터 출력을 지연하는 것입니다. 쿠키를 생성하기 전에 브라우저에 ob_start() 함수를 사용하여 추가할 수 있습니다. 이렇게 하면 문제가 해결될 수 있습니다. 그런데 ob_start()를 추가하려고 하면 실행이 별로 안 되는 프로그램이라 이걸 바꾸는 게 좀 씁쓸할 것 같네요! 이 오류가 발생했다는 것을 알았을 때 왜 내 로컬 컴퓨터에서 이 문제가 발생하지 않는지 궁금했습니다. PHP.ini 구성이 다르기 때문인 줄 알았는데, 생각해 보니 잘못된 것이었습니다. 더 같은. 그래서 이어서 나온 "output start at..."이라는 문장을 살펴보니 setcookie 이전에 다른 곳에 출력이 있었다는 뜻이어서, 출력이 시작된 뒤의 파일을 찾아보니 결국 첫 번째 줄이 비어 있는 것을 발견하게 되었습니다.
쿠키를 사용할 수 없게 만드는 ThinkPHP의 쿠키 및 세션 충돌에 대한 자세한 내용은 PHP 중국어 웹사이트를 참고하세요!