テクニカルセッション
ディレクトリ
予備的な技術知識のセッション
はじめにセッション技術:次のようにWebセッションを簡単に理解することができる。ユーザーは、ブラウザを閉じて、特定のWebサイトにアクセスし、ブラウザを開いて、複数のWebサーバのリソースにアクセスするために、複数のハイパーリンクでサイトをクリックして、全体のプロセスが呼び出されセッション。
特長のHTTPプロトコルは、ブラウザが繰り返し同じWebサーバーを要求すると、サーバは同じブラウザ(ユーザー)からの複数の操作かどうかを区別することができない、コネクションレス/ステートレスで、技術的なセッションは、HTTPプロトコルを作成する方法を見つけることですしたがって、複数の操作が追加の認証を必要とせずに続けることができ、同じサイトでブラウザ(ユーザー)を促進する、ブラウザの再三の要求を認識するために、同じサーバーから。
テクニカルセッションの分類
1)クッキーの技術
クッキーは、スクリプト上のサーバやワークステーションが顧客情報を維持するための方法することができ、HTTPプロトコルです。
クッキーは、ウェブサーバでユーザーのブラウザ(クライアント)に保存されたユーザーに関する情報を含めることができます(HTTPプロトコルのレスポンスヘッダ)、上の小さなテキストファイル。ユーザが(HTTPリクエストがデータを運ぶ)サーバに接続するたびに、ウェブサイトは、クッキー情報にアクセスすることができます。
2)セッション・テクノロジー
セッションは、必要に応じて間隔エンドユーザは、システムからログアウトまでの経過時間に通常のシステムへの登録から、インタラクティブシステムと通信し、時間を参照し、操作の余地を有していてもよいです。セッション技術がすることですサーバーにデータを保存する技術が技術に依存しているセッションクッキーを達成:ユーザーがセッション情報にアクセスすることができ、サーバー、ウェブサイトに接続するたびに。
二つの技術の間のセッション差
1)安全性
a)のセッションはサーバー側に保存され、安全な
b)のクッキーをブラウザに保存され、セキュリティが低く、
2)データサイズ態様
A)クッキー限度数及びサイズの両方(20 / 4K)
b)は、セッションデータストレージどれ
3)利用可能なデータ・タイプ
値/文字列:A)クッキーは、単純にデータを保存することができます
B)セッションデータを格納することができる複合体(自動シリアライズ)
4)に関して保存
ブラウザに保存されたa)のクッキー
b)のセッションは、サーバー上に保存されました
クッキーの基本的な使用
Cookieの原理
技術COOKIE:ブラウザにデータを格納することによりHTTPサーバは、ブラウザは、後で応答をアクセスサーバに対応するクッキーデータを搬送することができます。
図1に示すように、HTTPプロトコルを介してブラウザに応答して、ヘッド伝達関数データによって最初の要求、PHPのますsetcookie
2、ブラウザがブラウザにクッキー応答データが保存されます初めて
同じサイト3、後続のブラウザリクエストヘッダ内のデータを搬送するサーバへのリクエストがあった場合、クッキーは自動的にデータの有無を検出します。
PHPブラウザの実行が自動的にリクエストがクッキーを運ぶかどうかを判断する時期4は、もしあれば、自動的に$ _COOKIEのに保存されます。
5、$ _COOKIEクッキーデータアクセスを使用して
COOKIEの基本的な使用
設定されたCookie情報
ますsetcookie(文字列$名[、文字列$値=「」])関数は、情報クッキーを設定するために使用され
タイプは、クッキーの値が必要です。単純な文字列または整数型でなければなりません
COOKIEは、情報を読み取ります
1)$_COOKIE数组的使用
COOKIE(会话技术)能够实现跨脚本共享数据
COOKIE高级使用
COOKIE生命周期
COOKIE生命周期:COOKIE在浏览器生存时间(浏览器在下次访问服务器的时候是否携带对应的COOKIE)
1)默认(不设定)时的生命周期:不设定周期默认是关闭浏览器(会话结束)
2)设定一个常规日期戳的周期:通过setcookie 第三个参数可以限定生命周期,是用时间戳来管理,从格林威治时间开始
3)设定为“0”的周期:在第三个周期设定生命周期的时候,用0代替时间戳:表示就是普通设置,会话结束过期。
4)删除一个cookie做法:服务器没有权限去操作浏览器上的内容(不可能删除)。可以通过设定生命周期来让浏览器自动判定cookie是否有效,无效就删除。
4.1 清空cookie数据内容
4.2 设定时间戳过期
COOKIE作用范围
作用范围:在不同的文件夹层级中,设定的COOKIE默认是在不同的文件夹下有访问限制。上层文件夹中设定的COOKIE可以在下层(子文件夹)中访问,而子文件夹中设定的COOKIE不能在上层文件夹中访问。
1)默认(不设定)的范围:就是使用COOKIE默认的作用范围
上层看不到下层内容,下层可以看到上层内容
2)设定为“/”的含义:告知浏览器当前COOKIE的作用范围是网站根目录
setcookie(名字,值,生命周期,作用范围)
COOKIE跨子域
跨子域:在同一级别域名下,可以有多个子域名,它们之间是搭建在不同的服务器上(不同文件夹),但是可以通过COOKIE设置实现对应的COOKIE共享访问。但是默认是不允许跨域名访问的
1)设定cookie有效域名:不同的域名(包含主机)之间不能共享COOKIE,可以通难过setcookie函数的第五个参数来控制:setcookie(名字,值,生命周期,作用范围,有效域名)
2)不设定时的默认有效域名
3)跨子域的设定方法:在设定域名访问的时候设定上级域名即可:myphp.com,这个是所有以myphp.com结尾的网站都可以共享COOKIE
COOKIE数组数据
COOKIE本身只支持简单数据(数字或者字符串),能够保留的数据本身有限,也不成体系。如果需要使用COOKIE来表示一组数据的话,想办法凑成数组,(COOKIE不支持数组)
1)设置形式:setcookie(‘c1[k1]’,值)
2)读取形式:$_COOKIE[‘c1’][‘k1’]
SESSION基本使用
SESSION原理
Session与浏览器无关,但是与Cookie有关。
1、PHP碰到session_start开启session会话,会自动检测sessionID
a)如果Cookie中存在,使用现成的
b)如果Cookie中不存在创建一个sessionID,并通过响应头以Cookie形式保存到浏览器上
2、初始化超全局变量$_SESSION为一个空数组
3、PHP通过sessionID去指定位置(session文件存储位置)匹配对应文件
a)不存在该文件:创建一个sessionID命名文件
b)存在该文件:读取文件内容(反序列化),将数据存储到$_SESSION中
4、脚本执行结束:将$_SESSION中保存的所有数据序列化存储到sessionID对应的文件中。
SESSION基本使用
启用session,任何时候都需要开启session(脚本使用到$_SESSION就开启一次)
$_SESSION是通过session_start()函数的调用才会定义的,没有直接定义。
SESSION使用需要开启session_start()
设置SESSION信息
如果想存储数据到session中,那么只要不断给$_SESSION数组添加元素即可。
读取SESSION信息
$_SESSION就是一个数组,存储什么数据,什么方式的,就可以通过什么方式访问什么数据
会话技术的本质是为了实现跨脚本共享数据:在一个脚本中定义数据,在另一个脚本中保存数据
删除SESSION信息
删除session就是将session数据清理掉(让$_SESSION拿不到)
删除一个SESSION信息
unset($_SESSION[元素下标])删除指定SESSION数据
删除全部SESSION信息
删除全部数据就是让$_SESSION变成有一个空数组
SESSION相关配置
SESSION基础配置(php.ini)
1)session.name :session名字,保存到COOKIE中sessionID对应的名字
2)session.auto_start:是否自动开启session(无需手动session_start()),默认是关闭的
3)session.save_handler:session数据的保存方式,默认是文件形式
4)session.save_path:session文件默认存储位置
使用系统的文件夹存储不安全,需要指定存储路径
SESSION常用配置(php.ini)
1)session.cookie_lifetime:PHPsessionID在浏览器端对应COOKIE的生命周期,默认是会话结束
2) session.cookie_path:sessionID在浏览器存储之后允许服务器访问的路径(COOKIE有作用范围)
3)session.cookie_domain:COOKIE允许访问的子域(COOKIE允许跨子域)
配置的两种形式
1)php.ini中配置:全局配置
2)脚本中配置:PHP可以通过ini_set函数来在运行中设定某些配置项(只会对当前运行的脚本有效)把这种配置称之为项目级
@ini_set(‘session.save_path’,路径)
销毁SESSION
SESSION删除是指删除SESSION数据,,$_SESSION中看不到而已。销毁session是指删除session对应的session文件。
系统提供了一个函数:session_destroy(),会自动根据session_start()得到的sessionID去找到指定的session文件,并把其删除。
SESSION垃圾回收机制
垃圾回收机制原理
Session会话技术后,session文件并不会自动清除,如果每天有大量session文件产生当时又都是失效的,会增加服务器的压力和影响session效率。
垃圾回收,是指session机制提供了一种解决垃圾session文件的方式:给session文件指定周期,通过session文件最后更改时间和生命周期进行结合判定,如果过期则删除对应的session文件,如果没有过期则保留。这样可以及时清理无效的僵尸文件,从而提升空间利用率和session工作效率。
1、任何一次啊session开启,session都尝试去读取session文件
2、读取session文件后,有可能触发垃圾回收机制(在session系统中也是一个函数,:自己有一定几率调用)
3、垃圾回收机制会自动读取所有session文件的最后编辑时间,然后加上生命周期(配置文件)与当前时间进行比较(所有session文件)
a)过期:删除
b)有效:保留
垃圾回收参数设置(php.ini)
1)session.gc_maxlifetime = 1440:规定的session文件最大的生命周期是1440秒,24分钟。
2 ) session.gc_probability = 1:垃圾回收概率因子(分子)
3 ) session.gc_divisor = 1000:垃圾回收概率分母
默认的触发概率是1/1000;
禁用COOKIE后如何使用SESSION
禁用COOKIE不能使用SESSION的原因
SESSION技术需要利用到COOKIE技术来保存sessionID,从而使得PHP能够在跨脚本的时候得到相同的sessionID,从而访问同一个session文件。
解决思路:最终让session_start在开启之前拿到原来的sessionID(另外一个脚本的)
实现无COOKIE使用SESSION
方案1:利用PHP提供的SESSION函数:session_id和session_name来获的和设置sessionID或者name从而解决session_start产生新sessionID的情况(手动操作)
1、在session保存数据的脚本中获取session的id和名字
2、想办法将数据传递给另一个脚本:表单传值(URL或者form表单)
3、在需要使用session的脚本中,先接收数据
4、阻止session_start产生新的ID,告诉他已经存在:session_id($id),这时session_start不会再产生新的ID
方案2:可以利用session机制中已经提供的解决方案自动操作(配置)
原因1:默认session配置只允许使用COOKIE保存sessionID:session.use_only_cookies
原因2:默认关闭了其他能够传送数据的方式,只保留了cookie。
1、修改php.ini,开启其他方式传输sessionID,关闭只允许使用COOKIE传输功能
2、一旦配置开启,PHP会自动将sessionID和session名字在其他位置绑定数据,同时还会在session_start的时候,考虑其他方式(表单)传递的数据,而不是只有cookie