>  기사  >  백엔드 개발  >  PHP에서 Session 사용에 대한 자세한 설명

PHP에서 Session 사용에 대한 자세한 설명

jacklove
jacklove원래의
2018-05-22 11:29:331423검색

PHP를 학습하는 과정에서 캐싱 문제에 직면하게 됩니다. 이 글에서는 관련 내용을 자세히 설명하겠습니다.

Session 선언 및 사용

Session 설정은 쿠키와 다르므로 먼저 Session_start()를 PHP에서 호출해야 합니다. session_start() 함수의 구문 형식은 다음과 같습니다.

Bool session_start(void) //세션 생성, 세션 시작 및 세션 초기화

참고: session_start() 함수 이전에는 출력이 있을 수 없습니다

웹사이트를 처음 방문할 때 Seesion_start() 함수는 고유한 세션 ID를 생성하고 HTTP 응답 헤더를 통해 세션 ID를 클라이언트 쿠키에 자동으로 저장합니다. 동시에 서버 측에도 세션 ID를 딴 파일이 생성되어 사용자의 세션 정보가 저장됩니다. 동일한 사용자가 이 웹사이트를 다시 방문할 경우, 쿠키에 저장된 Sesion ID는 HTTP 요청 헤더를 통해 자동으로 가져오게 됩니다. 이때 Session_start() 함수는 새로운 Session ID를 할당하지 않고 서버의 하드를 검색합니다. 세션 ID와 동일한 이름의 세션 파일을 디스크에 저장하고, 이 사용자에 대해 이전에 저장된 세션 정보를 읽어서 현재 스크립트에 적용하여 이 사용자를 추적하는 목적을 달성합니다. 세션은 다음과 같은 배열 형태로 사용됩니다: $_SESSION['세션 이름']

세션 변수를 등록하고 세션을 읽습니다

PHP에서 세션 변수를 사용할 때 시작하는 것 외에도 다음 단계를 거쳐야 합니다. 등록 과정. 세션 변수 등록 및 읽기는 $_SESSION 배열에 액세스하여 완료됩니다. $_SESSION 연관 배열의 키 이름은 PHP의 일반 변수와 동일한 명명 규칙을 갖습니다. 세션 변수를 등록하는 코드는 다음과 같습니다.

코드는 다음과 같습니다

//启动session的初始化
session_start();
//注册session变量,赋值为一个用户的名称
$_SESSION["username"]="skygao";
//注册session变量,赋值为一个用户的ID
$_SESSION["uid"]=1;
>

스크립트를 실행한 후 두 개의 세션 변수가 서버 측에 파일로 저장됩니다. 파일의 위치는 PHP를 통해입니다. ini 파일, 세션에서 .save_path 속성으로 지정된 디렉터리에 있습니다.

변수 등록 취소 및 세션 파기

세션 변수를 사용한 후 삭제할 수 있고, 세션이 완료되면 파기할 수도 있습니다. 사용자가 웹 시스템에서 로그아웃하는 경우 로그아웃 기능을 제공해야 하며 해당 사용자의 모든 정보는 서버에서 파기됩니다. 현재 세션과 관련된 모든 데이터를 삭제하려면 session_destroy() 함수를 호출하여 현재 세션을 종료하고 세션의 모든 리소스를 지울 수 있습니다. 이 함수의 구문 형식은 다음과 같습니다.

bool session_destroy(void) //현재 Session과 관련된 모든 데이터를 삭제합니다.

이 함수는 현재 Session과 관련된 변수를 해제하지 않으며 세션에 저장된 쿠키를 삭제하지 않습니다. 클라이언트 Session

ID는 . $_SESSION 배열과 Custom 배열을 동일하게 사용하므로 unset() 함수를 사용하여 Session에 등록된 단일 변수를 해제할 수 있습니다. 아래와 같이:

unset($_SESSION['key name']);

전체 $_SESSION 배열을 삭제하기 위해 unset($_SESSION)을 사용하지 마십시오. 그러면 더 이상 $를 통해 변수를 등록할 수 없습니다. _SESSION 슈퍼 전역 배열. 하지만 사용자가 Session에 등록한 모든 변수를 삭제하려면 배열 변수 $_SESSION을 빈 배열에 직접 할당하면 됩니다. 아래와 같이

$_SESSION=array()

PHP의 기본 Session은 Cookie를 기반으로 합니다. Session

ID는 서버에 의해 클라이언트의 Cookie에 저장되므로, 다음과 같은 경우에도 Cookie에 저장된 SessionID를 지워야 합니다. 세션에서 로그아웃하려면 setCookie() 함수를 사용해야 합니다. PHP 스크립트에서는 session_name() 함수를 호출하여 세션 이름을 얻을 수 있습니다. 클라이언트 쿠키에 저장된 Session

ID를 삭제합니다.

코드는 다음과 같습니다

//쿠키에 세션ID가 존재하는지 확인

if(isset($_COOKIE[session_name() ])){

//세션 ID가 포함된 쿠키를 삭제합니다. 네 번째 매개변수는 php.ini

setcookie(session_name(),'',time()-3600, '/');

}

>

앞서 소개에서 세션 로그아웃 과정은 총 4단계가 필요하다는 결론을 내릴 수 있습니다. 다음 예에서는 전체 4단계 코드가 제공됩니다. 스크립트를 실행하면 세션이 닫히고 이 세션과 관련된 모든 리소스가 삭제됩니다. 코드는 다음과 같습니다.

코드는 다음과 같습니다

//第一步:开启Session并初始化
session_start();
//第二部:删除所有Session的变量,也可以用unset($_SESSION[XXX])逐个删除
$_SESSION = array();
//第三部:如果使用基于Cookie的session,使用setCookkie()删除包含Session ID的cookie
if(isset($_COOKIE[session_name()])) {
setCookie(session_name(), "", time()-42000, "/");
}

//4부: 마지막으로 세션을 완전히 삭제

session_destroy();
>
session的phpini配置选项
php.ini文件和Session有关的几个常用配置选项:
session.auto_start = 0 ; 在请求启动时初始化session
session.cache_expire = 180 ; 设置缓存中的会话文档在 n 分钟后过时
session.cookie_lifetime = 0 ; 设置按秒记的cookie的保存时间,相当于设置Session的过期时间,为0时表示直到浏览器被重启

session.auto_start=1이므로 사용하기 전에 매번 session_start()를 호출할 필요가 없습니다. 그러나 이 옵션을 활성화하는 데에는 몇 가지 제한 사항이 있습니다. session.auto_start가 실제로 활성화된 경우 개체를 다시 생성하려면 세션을 시작하기 전에 클래스 정의를 로드해야 하기 때문에 세션에 개체를 넣을 수 없습니다. 세션.

session.cookie_path = / ; cookie的有效路径
session.cookie_domain = ; cookie的有效域
session.name = PHPSESSID; 用在cookie里的session的名字
session.save_handler = files ; 用于保存/取回数据的控制方式
session.save_path = /tmp ; 在 save_handler 设为文件时传给控制器的参数, 这是数据文件将保存的路径.
session.use_cookies = 1 ; 是否使用cookies

세션의 자동 가비지 수집 메커니즘

可以通过session_destroy()函数在页面中提供一个“退出”按钮,通过单击销毁本次会话。但如果用户没有单击退出按钮,而是直接关闭浏览器,或断网等情况,在服务器端保存的Session文件是不会删除的。虽然关闭浏览器,下次需要重新分配一个新的Session ID重新登录,但这只是因为在php.ini中的设置seesion.cookie_lifetime=0,来设定Session ID在客户端Cookie中的有效限期,以秒为单位指定了发送到浏览器的Cookie的生命周期。当系统赋予Session有效期限后不管浏览器是否开启,Session ID都会自动消失。而客户端Session ID消失服务器端保存的Session文件并没有被删除。所以没有被Sessoin ID引用的服务器端Session文件,就成为了“垃圾”。

服务器保存的Session文件就是一个普通文本文件,所以都会有文件修改时间。“垃圾回收程序”启动后就是根据Session文件的修改时间,将所有过期的Session文件全部删除。通过在php.ini中设置session.gc_maxlifetime选项来指定一个时间(单位:秒),例如设置该选项值为1440(24分钟)。“垃圾回收程序”就会在所有Session文件中排查,如果有修改时间距离当前系统时间大于1440秒的就将其删除。

“session垃圾回收程序”是怎样的启动机制呢“垃圾回收程序”是在调用session_start()函数时启动的。而一个网站有多个脚本,没有脚本又都要使用session_start()函数开启会话,又会有很多个用户同时访问,这就很可能session_start()函数在1秒内被调用N次,而如果每次都会启动“session垃圾回收程序”,这样是很不合理的。可以通过php.ini文件中修改“session.gc_probability和session.gc_pisor”两个选项,设置启动垃圾回收程序的概率。会根据“session.gc_probability/session.gc_pisor”公示计算概率,例如选项session.gc_probability=1,而选项session.gc_pisor=100,这样的概率就是“1/100”,即session_start()函数被调用100次才会有一次可能启动“垃圾回收程序”。

php.ini中相关的配置

session.cookie_lifetime=0; 关闭浏览器相应的cookie文件即被删除
session.gc_maxlifetime; 设置过期session时间,默认1440秒(24分钟)
session.gc_probability/session.gc_pisor; 启动垃圾回收机制的概率(建议值为1/1000——5000)

cookie禁用时通过URL传递session的ID

使用Session跟踪一个用户,是通过在各个页面之间传递唯一的Session ID,并通过Session ID提取这个用户在服务器中保存的Session变量。常见的Session ID传送方法有以下两种。

第一种方法是基于cookie的方式传递session ID,这种方式更优,但不总是可用, 因为用户在客户端可以屏蔽cokie;

第二种方法是通过url参数进行传递,直接将session ID嵌入到URL中去。

在Session的实现中通常都是采用Cookie的方式,客户端保存的Session ID就是一个Cookie。当客户禁用Cookie时,Session ID就不能在Cookie中保存,也就不能在页面之间传递,此时Session失效。不过PHP5在Linux平台可以自动检查Cookie状态,如果客户端禁用它,则系统自动把Session ID附加到URL上传送。而使用Windows系统作为Web服务器则无此功能。

在PHP中提出了跟踪Session的另一种机制,如果客户浏览器不支持Cookie,则PHP可以重写客户请求的URL,把Session ID添加到URL信息中。可以手动地在每个超链接的URL中都加上一个Session ID,但工作量比较大,不建议使用这种方法。如下所示:

代码如下

//开启session

session_start();

//在每个URL后面附加上参数,变量名为session_name()获取名称,值通过session_id()获取

echo '连接演示';

>

在使用Linux系统做服务器时,则在编辑PHP时如果使用了–enable-trans-sid配置选项,和运行时选项session.use_trans_sid都被激活,在客户端禁用Cookie时,相对URL将被自动修改为包含会话ID。如果没有这么配置,或者使用Windows系统作为服务器时,可以使用常量SID。该常量在会话启动时被定义,如果客户端没有发送适当的会话Cookie,则SID的格式为session_name=session_id,否则就为一个空字符串。因此可以无条件地将其嵌入到URL中去。在下例中使用两个脚本程序,演示了Session ID的传送方法。

session_start();
$_SESSION["username"]="admin";
echo "session ID:".session_id()."
";

本篇详解了session的相关问题,更多相关知识请关注php中文网。

相关推荐:

php中die(),exit(),return的区别介绍

SQL 中 on 条件与 where 条件的区别

关于php 压缩CSS代码的方法

위 내용은 PHP에서 Session 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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