1. セッションとは
セッションの正式な定義は次のとおりです: セッション: コンピュータ、特にネットワーク アプリケーションでは、「セッション コントロール」と呼ばれます。 Session オブジェクトには、特定のユーザー セッションに必要なプロパティと構成情報が格納されます。
端的に言えば、セッションはサーバー側を維持できるデータ ストレージ テクノロジです。セッションには主に次の特徴があります:
1. セッションはサーバー側に保存されます
2. セッションは通常 Cookie を使用して使用されます。ブラウザが Cookie 機能を無効にすると、つまり、セッションストレージ機能を実装するには、URL 書き換えのみを使用できます。
3. 単にユーザーの状態を維持するためにセッションを使用する場合、同時にログインしているユーザーが多数である場合や、セッション数が多いと、クエリが遅いという問題が発生します。
本質的に: セッション技術とは、データベースとは異なるバックエンドに基づいてデータを一時的に保存する技術です。
2なぜセッションがあるのか
主な理由の 1 つは HTTP のステートレス性です。
HTTP のステートレス性のため、現在のユーザーのステータスを知る方法がありません。 HTTP はリクエストを送信します。例えば、現在どのユーザーに属しているかなどの情報が送信されます。このとき、現在の状態を識別するためにセッションが必要です。
3. セッションの仕組み
次に、ユーザーのログインをシミュレートするフローチャートを通じてセッションの原理を理解しましょう。このときユーザーがログイン操作を実行すると仮定します。具体的なセッションのワークフローは次のとおりです。
プロセス全体は大まかに次のステップに分かれています:
1. 最初のステップは、ローカル Cookie 内のセッション ID、ユーザー名、およびパスワードをバックグラウンドに移動することです
2. 2 番目のステップ バックグラウンドは、対応するセッション識別子があるかどうかを検出します。PHP を例に挙げます。次に、対応する PHPSESSID
3 が受信されたかどうかを検出します。そうでない場合は、新しいセッションが開始されます直接生成されます。 「はい」の場合は、対応するファイルが存在し、有効であるかどうかを確認してください。
#3. 無効な場合は、セッションをクリアして新しいセッションを生成する必要があります。無効ではありません。現在のセッションを使用してください。ここを参照すると、セッションの動作原理を予備的に理解できるかもしれません。セッションの概略図は次のとおりです。4. セッションの共通構成
PHPSESSID
session .name = PHPSESSID
session.use_trans_sid を設定して、識別子の対話方法を Cookie から URL 配信
# に変更できます。 ## 対応する設定:
3. セッションの保存場所を設定します
対応する設定は
session.save_path="D: \phpStudy\ PHPTutorial\tmp\tmp"まず、
wamp または # をインストールする必要があります。 ## phpstudy、具体的な方法は Baidu にあります
セッション ファイルの変更を観察しやすくするために、セッションの保存パスを見つける必要があります (
session.save_path を見つけます)。
session_start() を使用することです。次に、作成されたセッションに変数を追加します。はデモ1、値はデフォルト、コードは次のとおりです:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default"; ?>
実行結果は次のとおりです:
再編集するとセッション内のコンテンツの効果は次のとおりです:
我们观察最近一条的修改日期,我们可以发现就是日期发生了变化,但是文件名没有变化,也就是说,修改session中的内容不会导致文件被新建,而是执行对文件的重新写入操作
session的销毁
销毁session一般有两种方式,unset
和session_destroy
,我们先来说说第一种
代码如下:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; //session的销毁 unset($_SESSION); ?>
这一个相当于没有删除session文件,但是使得即使有对应的PHPSESSID也无法获取到相应的session
session_destroy()
相对来说比较彻底,直接删除对应的session文件
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; var_dump(session_name()); //session的销毁 session_destroy(); ?>
对于个人来说比较推荐使用第二种方法,因为当要销毁session的时候,那么也就意味着session已经失效了,所以这个时候我们把它给删掉才是最好的处理方式,一方面可以减少对硬盘的存储,另外一方面可以相对优化session的查询速度。
好了,这个时候我们应该要设置传递给浏览器端的cookie了,默认是自动传送,但是我们应该要学习的是怎样通过后端设置cookie过去
其中有两个方法与session有关的方法我们需要记住,第一个是session_name()
,这个是获取cookie的key值得,第二个是session_id
,这个是session的文件名
设置的示例代码:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; setCookie(session_name(),session_id(),time()-1000); ?>
在设置cookie的时候,我们为了程序的安全性,我们应该要禁止JS可以对cookie进行重写,所以需要设置HTTP ONLY
,具体的设置方法在Php.ini中找到session.cookie_httponly
然后将其的值设置为1或者true即可
除此之外还可以通过setCookie
和ini_set()
来动态设置HTTPONLY属性
在使用session的时候,虽然会从浏览器把PHPSESSID传给后端,但是这个课程不需要人为的去参与。我们只需要保证HTTPONLY被设置就行了。下面是完整的代码:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session if ($_SESSION) { var_dump($_SESSION["demo1"]); } else { $_SESSION["demo1"] = "default_" . time(); var_dump($_SESSION["demo1"]); setCookie(session_name(), session_id(), time(), NULL, NULL, NULL, true); } ?>
6、session的相关注意事项
1. 关闭浏览器session同样存在
如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie
也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件
2. session性能瓶颈怎样解决?
如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis
或者mongodb
,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度
3. 一般不使用URL重写的方法来传递PHPSESSID
其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率
更多的session的相关配置请点击这里
7、更多的一些PHP.in中的session含义
[Session]
session.save_handler
=的存储方式
session.use_cookies
= 1 #使用cookies在客户端保存会话
session.use_only_cookies
= 1 #去保护URL中传送session id的用户
session.name
= PHPSESSID #session名称(默认PHPSESSID)
session.auto_start
= 0 #不启用请求自动初始化session
session.cookie_lifetime
= 0 #cookie存活时间(0为直至浏览器重启,单位秒)
session.cookie_path
= / #cookie的有效路径
session.cookie_domain
= #cookie的有效域名
session.cookie_httponly
= #httponly标记增加到cookie上(脚本语言无法抓取)
session.serialize_handler
= php #PHP标准序列化
session.gc_probability
=1
session.gc_divisor =1000
#建议设置1000-5000
#概率=session.gc_probability
/session.gc_divisor
(1/1000)
#页面访问越频繁概率越小
session.gc_maxlifetime
=1440 #过期时间(默认24分钟,单位秒)
session.bug_compat_42
= off #グローバル初期化セッション変数
session.bug_compat_warn
= off
session.referer_check
= #ID
##session.entopy_length = 0 #Bytes read
session.cache_limiter = { nocache,private,pblic} の外部 URL を防止します#HTTP バッファ タイプ
session.cache_expire = 180 #ドキュメントの有効期限 (分)
session.use_trans_sid = 1 #trans_sid サポート (デフォルト) 0)
session.hash_function = 0 #ハッシュ メソッド {0:md5(128 ビット),1:SHA-1(160 ビット)}
session.hash_bits_per_character = 5 #バイナリハッシュデータを読み取り可能な形式に変換する場合、文字ごとに保持されるビット数
session.save_path = "/ var/lib/php/session " #session id storage path
以上がセッションの詳細な理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。