>  기사  >  백엔드 개발  >  PHP 세션이 작동하지 않으면 어떻게 해야 할까요?

PHP 세션이 작동하지 않으면 어떻게 해야 할까요?

藏色散人
藏色散人원래의
2020-09-28 09:04:143336검색

PHP 세션이 작동하지 않는 해결 방법: 먼저 PHP 구성 파일을 연 다음 세션 관련 구성 항목을 찾은 다음 새 세션 파일을 만들고 권한을 설정한 후 마지막으로 파일을 다시 업로드하세요.

PHP 세션이 작동하지 않으면 어떻게 해야 할까요?

추천: "PHP 동영상 튜토리얼"

PHP 프로젝트에서 세션 실패를 해결하는 방법

오늘 퇴근하고 셔틀버스를 탔는데, 역에 도착하려던 참에 리더님. 이전 회사에서 불을 끄려고 QQ를 보냈습니다. 차에서 내린 후 돌아와서 컴퓨터로 자세히 물어봤습니다. 리더의 설명은 다음과 같습니다

이 주소를 도와주세요. 시험지를 올리고 과제를 게시한 후 왜 그런지 알겠어요? 답안지 설정을 하면 세션이 없어져요

이 프로젝트의 백엔드는 처음에 제가 직접 개발했기 때문에 문제를 빨리 발견했습니다. 프로세스는 사용자가 js 구성 요소를 통해 시험지를 업로드하는 방식으로, 방금 업로드한 시험지의 세부 정보(예: 이름, 접미사, ID)를 세션에 저장하는 데 사용됩니다. 업로드가 성공한 후 페이지에서 학교, 학년, 난이도 등 다른 옵션을 클릭하고 마지막으로 제출 처리 방법에서 제출 여부를 판단합니다. 방금 업로드한 세션 값이 존재하지 않으면 시험지 홈페이지로 이동합니다. 이 방법으로 $_SESSION을 인쇄했지만 값이 없었습니다. 이전에는 잘 작동했습니다. 그래서 언제 시작하냐고 물었더니 리더님이 오후에 퇴근하려고 하는데 선생님이 전화해서 시험지 업로드와 답안지 설정에 실패했다고 해서 계속 튕겨나간다고 하더군요. 그러다가 다시 서버 환경이 바뀌었냐고 물었더니 리더님이 아니라고 하더군요.

문제가 있으니 해결해보자. 그러던 중 우연히 세션과 쿠키에 대해 자세히 설명하고 있는 "PHP 핵심 기술 및 모범 사례"라는 책을 읽게 되었고, 두 가지에 대한 이해도 깊어졌습니다. 그래서 먼저 php 설정 파일을 열어서 세션 관련 설정 항목을 찾아보니 session.save_path가 /data2/session으로 되어 있던 것을 발견했는데 예전에는 /data1/session으로 설정되어 있던 걸로 기억합니다. 그래서 종료하고 경로를 살펴보았습니다. 처음에는 디렉토리에 권한이 부족하다고 생각했지만 나중에는 그러한 디렉토리가 전혀 없다는 것을 알았습니다. 각 세션이 페이지에 걸쳐 있지 않은 것은 당연합니다. 그래서 새 파일을 만들고, 권한을 설정하고, 다시 업로드했더니 모든 것이 정상으로 돌아왔습니다.

이 글을 쓰면서 세션과 관련된 몇 가지 기술적인 사항에 대해서도 이야기하고 싶습니다. 세션은 서버 측에 저장되며, 기본적으로 파일(session.save_handler = files)에 저장됩니다. 그러면 세션은 어떻게 생성되나요? session_start() 함수를 통해 세션이 생성되며, 이 함수가 실행되면 세션이 저장된 디렉터리에 파일과 이에 해당하는 고유한 세션 ID가 생성됩니다. 세션 파일의 데이터는 세션 ID를 통해 검색할 수 있습니다. . session_start()가 실행될 때마다 새로운 세션 파일이 생성되는데, 이전에 생성된 세션 파일을 어떻게 사용하나요? 세션 파일을 읽어보세요. 기본적으로 세션 ID는 클라이언트(브라우저)의 쿠키를 사용하여 세션 ID를 저장하고(크롬 브라우저에서 F12를 누르고 Resources-cookies를 클릭하면 볼 수 있음) $_COOKIE['PHPSESSID']를 사용하여 얻을 수 있습니다. 해당 PHPSESSID는 세션 ID의 기본 이름입니다. php.ini에서 session.name으로 설정할 수 있습니다. 세션 ID의 이름을 얻으려면 스크립트에서 session_name()을 사용하세요. 브라우저가 서버와 통신할 때마다 브라우저는 세션 ID를 서버에 전달하고, 서버는 전달된 세션 ID를 기반으로 해당 세션 파일을 찾아 해당 정보를 얻고 관련 작업을 수행합니다. 클라이언트(브라우저)가 쿠키를 비활성화하면 서버는 세션 ID를 수신하지 않습니다. 이때 세션 ID를 명시적으로 전달해야 합니다. 두 가지 방법: URL을 통해 세션 ID를 수동으로 전달합니다. 숨겨진 양식을 통해 세션 ID를 전달합니다. 위의 두 가지 방법에서는 서버의 PHP 환경에서 session.use_trans_sid 값이 1이어야 합니다.

이렇게 장황한 끝에 결국은 "말이 싸니까 코드를 보여주세요"라는 리누스의 말이 나왔습니다.

<?php
session_start();
$_SESSION[&#39;arr&#39;] = array(&#39;name&#39; => &#39;molaifeng&#39;, &#39;hobby&#39; => &#39;php&#39;);
?>
<a href="testSession.php?<?php echo session_name(); ?>=<?php echo session_id()?>">testSession</a>
<?php
 
session_start($_REQUEST[session_name()]);
print_r($_SESSION);

코드는 이해가 되실테니 따로 설명하지 않겠습니다.

마지막으로 요약하면 일반적으로 위에 나열된 사항으로 인해 페이지 간 세션 실패가 발생합니다. 1. 권한이 부족하거나 디렉터리가 존재하지 않는 등 session.save_path가 올바르지 않습니다. 2. 서버 PHP 구성의 session.use_trans_sid 값이 0입니다. 클라이언트에서 쿠키가 비활성화되어 있습니다. 하지만 첫 번째 상황의 빈도는 상당히 높아야 한다고 생각합니다.

【2018-05-21 업데이트】

금요일 밤에 온라인에 접속하다가 또 다른 함정에 빠졌습니다. 프레임워크는 CI 및 MySQL 테이블에 대한 세션 쓰기를 사용합니다. 처음에는 위에서 설명한 증상과 증상이 똑같아서 Seesion 디렉터리를 재설정하고 관련 읽기, 쓰기 권한을 줬으나 아무 일도 일어나지 않았습니다. 나중에 알고 보니 그 테이블이 메모리 테이블의 최대값을 초과한 것 같아 테이블을 지워봤지만 문제는 계속 발생했습니다. 마지막으로 두 버전의 차이점을 비교해본 결과 세션을 저장할 때 두 개의 새로운 필드가 추가된 것을 발견하여 제거 방법을 사용하여 먼저 두 버전 모두에 주석을 달고 하나씩 열어서 마침내 문제를 찾았습니다. 타입 테이블의 모든 값을 저장하기 위해 새로운 값을 사용하는 것으로 나타났는데, 처음에 테스트할 때는 몇 가지 값만 있었는데 나중에 온라인에 접속해보니 100개가 넘는 값이 있었습니다. 동시에 필드의 크기는 3000에 불과했습니다. 그래서 먼저 필드의 크기를 늘려서 온라인으로 검증하도록 한 뒤, 테이블의 모든 값이 기록되지 않도록 관련 로직을 변경했습니다.

위 내용은 PHP 세션이 작동하지 않으면 어떻게 해야 할까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.