오늘 저는 엄격하게 30분 안에 만료되는 세션을 설정하는 방법에 대한 Niao 형제의 기사를 읽었습니다.
나는 PHP의 세션 메커니즘에 관심을 가지게 되었고, 이를 연구하기 위해 인터넷에서 몇 가지 정보를 찾았습니다.
PHP 세션 관리 시스템은 다양한 구성 옵션을 지원하며, 이는 자신의 php.ini 파일에서 설정할 수 있습니다.
php.ini의 세션 구성에서 session.save_handler는 세션과 관련된 데이터를 저장하고 가져오는 프로세서의 이름을 정의합니다. 기본값은 파일입니다. 개별 확장은 자체 등록된 처리를 등록할 수 있습니다. 프로그램은 phpinfo()를 참조하여 설치별로 사용할 수 있습니다. session_set_save_handler()를 참조하세요.
PHP 구성에서 세션을 처리하는 방법에는 두 가지가 있습니다. 하나는 기본 파일이고 다른 하나는 사용자 정의입니다.
1. session.save_handler=files
1. session_start()
1.1 session_start()는 세션 메커니즘의 시작입니다. 세션이 파일에 저장되기 때문에 SESSION 세션에 대한 자체 가비지 수집이 유효하지 않습니다. 확률은 php.ini(session.save_path) 구성에 따라 결정됩니다.
일부 시스템에는 session.gc_probability = 0이 있는데, 이는 확률이 0임을 의미하며 가비지 수집은 cron 스크립트를 통해 구현됩니다.
<code> session<span>.gc</span>_probability = <span>1</span> session<span>.gc</span>_divisor = <span>100</span> session<span>.gc</span>_maxlifetime = <span>1440</span>//过期时间 默认<span>24</span>分钟 //概率是 session<span>.gc</span>_probability/session<span>.gc</span>_divisor 结果 <span>1</span>/<span>100</span>, //不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。 session<span>.save</span>_path = //好像不同的系统默认不一样,有一种设置是 <span>"N;/path"</span> //这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本</code>
1.2 세션은 현재 $_COOKIE[session_name()]이 있는지 확인합니다. session_name()은 session_id를 저장하는 COOKIE 키 값을 반환합니다. 이 값은 php.ini에서 찾을 수 있습니다.
<code><span>session.name </span>=<span> PHPSESSID //默认值PHPSESSID</span></code>1.3 존재하지 않는 경우 session_id가 생성되며, 생성된 session_id는 COOKIE 값으로 클라이언트에 전달됩니다. 이는 다음 COOKIE 작업을 실행하는 것과 동일합니다. 이 단계는 setcookie() 작업을 실행합니다. 이 전에는 COOKIE가 출력될 수 없습니다. 이 함수를 사용하면, 그 전에는 출력이 있을 수 없습니다.
<code> setcookie(session_name(), session_id(), session.cookie_lifetime,<span>//</span>默认<span>0</span> session.cookie_path,<span>//</span>默认<span>'/'</span>当前程序跟目录下都有效 session.cookie_domain,<span>//</span>默认为空 )</code>1.4 존재하는 경우 session_id =
$_COOKIE[session_name]
그런 다음 session.save_path에 지정된 폴더로 이동하여 'SESS_'라는 파일을 찾습니다.
파일 내용을 읽고 역직렬화한 후
$_SESSION 전역 변수 에 넣습니다.
2.
$_SESSION에 값을 할당합니다.
예를 들어 새 값
$_SESSION['test']= 'test';를 추가하면 이 $_SESSION은 스크립트 실행이 종료될 때만 유지됩니다. , $_SESSION session_id로 지정된 폴더에 값을 기록한 후 관련 리소스를 닫는 단계에서 session_id를 변경하는 작업을 수행할 수 있습니다.
예를 들어 이전 session_id를 삭제하고 새 session_id를 생성합니다. 그 중 절반은 사용자 정의 세션 작업 및 역할 변환에 사용됩니다. 예를 들어 Drupal의 익명 사용자는 로그인할 때 SESSION을 사용해야 합니다. 새 세션_ID.
<code>if (<span>isset($_COOKIE[<span>session_name()</span>])</span>) { <span>setcookie(<span>session_name()</span>, <span>''</span>, <span>time()</span> - <span>42000</span>, <span>'/'</span>)</span>;<span>//旧session cookie过期</span> } <span>session_regenerate_id()</span>;<span>//这一步会生成新的session_id</span><span>//session_id()返回的是新的值</span></code>3. SESSION 작업 쓰기
스크립트가 끝나면 SESSION 쓰기 작업이 수행되고
$_SESSION의 값이 session_id라는 파일에 기록됩니다. 이미 존재할 수도 있고 새 파일이 필요할 수도 있습니다. 생성되었습니다.
4. 세션 삭제
SESSION에서 전송한 COOKIE는 일반적으로 인스턴트 COOKIE이며 메모리에 저장됩니다. 브라우저를 닫는 대신 로그아웃하는 등 수동으로 만료를 강제해야 하는 경우에는 해당 쿠키를 파기해야 합니다. 코드에는 여러 가지 방법이 있습니다.
4.1 setcookie(session_name(), session_id(), time() - 8000000, ..);//로그아웃 전 실행
4.2 usset(
$
_SESSION);//새로 고침 후에는 모든 $_SESSION 데이터가 삭제되지만 COOKIE는 전달되지만 데이터는 없습니다.
4.3 session_destroy();//이 함수는 더 철저합니다. $_SESSION을 삭제하고 세션 파일과 session_id를 삭제합니다
브라우저를 닫지 않고 다시 새로고침을 하면 2번과 3번에 COOKIE가 전송되는데 데이터를 찾을 수 없습니다
2. session.save_handler=user
자세한 내용은 PHP 매뉴얼 http://php.net/manual/zh/function.session-set-save-handler.php