php의 세션 확장은 컨테이너가 php_session.h에서 인터페이스를 구현하는 한 모든 컨테이너에 세션 데이터를 저장할 수 있습니다.
typedef struct ps_module_struct { const char *s_name; int (*s_open)(PS_OPEN_ARGS); int (*s_close)(PS_CLOSE_ARGS); int (*s_read)(PS_READ_ARGS); int (*s_write)(PS_WRITE_ARGS); int (*s_destroy)(PS_DESTROY_ARGS); int (*s_gc)(PS_GC_ARGS); char *(*s_create_sid)(PS_CREATE_SID_ARGS); } ps_module;
session.auto_start = 1이 php.ini에 정의된 경우 세션 확장은 요청 초기화 단계(rinit) 동안 s_open 및 s_read 데이터를 호출합니다.
php 페이지에서 session_start()가 호출되면(첫 번째 호출만 적용됨) 세션 확장은 s_open 및 s_read 데이터도 호출합니다.
그러나 세션 데이터가 포함되지 않은 일부 페이지의 경우 세션 데이터를 읽으면 디스크 작업이나 네트워크 작업 등 성능 낭비가 발생합니다.
따라서 세션 데이터가 포함된 페이지와 세션 데이터가 포함되지 않은 페이지를 다르게 처리하는 방법을 찾아야 하지만 처리 코드는 일관되어야 합니다.
session.auto_start = 1을 제거하고 session.auto_start = 0으로 변경하고 쿠키에 session_name이 없는 요청에 대해서는 session_start() 호출을 지연시키는 것이 아이디어입니다.
쿠키에 session_name이 없으면 호출할 때. session_start(), 세션 확장은 자동으로 session_id를 생성하고 Set-Cookie 헤더를 전송합니다. 헤더 정보는 페이지가 콘텐츠를 출력하기 전에 출력되거나 페이지 콘텐츠를 출력 버퍼에 넣어 출력을 지연해야 합니다.
최종 구현은 다음과 같습니다.
auto_prepend_file:
<?php if (isset($_COOKIE[session_name()])) { define('SESSION_STARTED', true); @session_start(); } else { ob_start(); }
<?php if (!defined('SESSION_STARTED') && $_SESSION) { $session_copy = $_SESSION; @session_start(); if (!$_SESSION) { $_SESSION = $session_copy; } ob_end_flush(); }
위 내용은 내용의 측면을 포함하여 PHP 세션 최적화의 사용법을 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.