PHP を使用してバックエンドを開発する場合、データを保存する必要があります。通常のアプローチはそれをデータベースに保存することですが、場合によっては、データをデータベースに保存する必要がないこともあります。たとえば、Web ページにログインすると、その Web サイトに最後にアクセスした時刻が同時にデータベースに保存される必要はありません。 Web ページにログインし、ログイン ユーザー名を保存します。これらの問題は、データベースに保存せずに、PHP のセッション テクノロジを使用して解決できます。
PHPのクッキー技術とセッション技術は、どちらもセッション用です。ここでのセッションとは、ユーザーがブラウザを開いてWebサイトにアクセスしてから、Webサイトのページを閉じるまでをセッションと呼んでいます。セッション中、ユーザーは Web サイトのページ上のさまざまなハイパーリンクを複数回クリックできます。
ウェブサイトおよびウェブサイト内のページにアクセスすると、ウェブサイトが起動します。それはただのセッションです。
Web サイトにアクセスすると、Web サイトに入るとすぐに、現在の Web サイトに最後にアクセスした時間が Web ページ上に表示されることがあります。この時間は Cookie を使用して保存できます。
Cookie はクライアント側のテクノロジーであり、サーバーは各ユーザーのデータを Cookie の形式でユーザーのそれぞれのブラウザに書き込みます。ユーザーがブラウザを使用してサーバー上の Web リソースにアクセスすると、独自のデータが持ち込まれます。このようにして、Web リソースはユーザー自身のデータを処理します。 Cookie テクノロジーはブラウザ側で書き込まれるファイルであることに注意してください。同時に、Cookie はキーと値のペアの形式で保存されます。
上記のフローチャートからわかるように、サーバーのPHPファイルにCookieを作成したい場合、サーバーはCookie作成情報を情報転送用のhttpプロトコルの応答ヘッダーにカプセル化し、ブラウザーは応答ヘッダーを分析した後、サーバーがブラウザーで Cookie を作成し、ブラウザーが Web サイトに再度アクセスしたときに、ローカルに Cookie ファイルを作成する必要があることがわかります。情報をサーバーに送信します。
Cookie:user=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
Cookieの使用については、簡単に言うとCookieの追加、削除、変更、確認の操作と理解できます。
Cookieの作成は実際には非常に簡単です
<?php //通过setcookie函数进行cookie的创建 setcookie('username','abc',time()+3600);
setcookie()関数を通じてCookieを作成し、Cookieはブラウザのキャッシュに保存されます。
Set-Cookie:username=abc; expires=Mon, 17-Oct-2016 08:55:51 GMT; Max-Age=3600
setcookie(parameter 1,parameter 2,parameter 3) コードを見ると、この関数には 3 つのパラメーターが渡されていることがわかります。
最初のパラメーターは、情報名を保存するキーです。
2 番目のパラメータはキーに対応する値です
3 番目のパラメータは、この Cookie が保存された時間です。ここで保存される時間は、現在の時間に 3600 秒を加えたものです。この時間を超えると、Cookie は保存されます。期限切れ 。
上記のコードの実行が完了すると、ブラウザのキャッシュ ファイルに作成された Cookie ファイルが表示されます。これには保存されたデータが含まれています。
username abc www.lijiafei.com/test3/ 1536 2120470400 30550100 480638768 30550092 *
上記のデータを保存しました。データを保存する目的はデータを読み取ることであり、Cookieの読み取りは次のように理解できます:
ブラウザがWebサイトのページをリクエストしたとき。 , http プロトコルに従って: ブラウザーは、http リクエストを通じて Web サイトの Cookie 情報をサーバーのリクエスト ページに送信します
サーバーが Cookie 情報を受信した後、それは $_COOKIE 配列にカプセル化されます。
$_COOKIE 配列から読み取ります。
<?php echo '<pre class="brush:php;toolbar:false">'; //自动封装到这个数组里面 var_dump($_COOKIE); //通过键名取出值。 $username = $_COOKIE['username']; echo $username; ......结果....... array(3) { ["user"]=> string(3) "abc" ["username"]=> string(3) "abc" ["PHPSESSID"]=> string(26) "v6ntsa42f4v0h5jpaoa1tot8r6" } abc
ファイルにアクセスするとき、リクエスト ヘッダーを通じて Cookie 情報を渡します。
Cookie:user=abc; username=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
Cookieの値を変更したい場合、変更を完了するためにsetcookieを使用しますが、Cookieが存在しない場合は作成し、すでに存在する場合は変更します。 。
<?php //通过setcookie函数进行修改,但是如果浏览器没有cookie则进行创建。 setcookie('username','abc123',time() + 1600);
Cookie の値を読み取ると、内部の値が正常に変更されたことがわかります。
array(3) { ["user"]=> string(3) "abc" ["username"]=> string(6) "abc123" ["PHPSESSID"]=> string(26) "v6ntsa42f4v0h5jpaoa1tot8r6" } abc123
Cookieが使用できなくなった場合、Cookieの値を手動で破棄することができます。
Cookie データの削除は 2 つのステップとして理解できます。1. ブラウザーのキャッシュに保存されている Cookie ファイルを削除します。2. サーバーの $_COOKIE 配列に保存されているデータを削除します。
<?php //使用setcookie这个函数进行删除 setcookie('username','',time()-1); //删除保存在$_COOKIE里面的数据 if(isset($_COOKIE['username'])){ unset($_COOKIE['username']); } //删除保存在浏览器中这个网站的所有的cookie foreach ($_COOKIE as $key => $value) { setcookie($key,$value,time()-1); } //销毁所有数据 unset($_COOKIE);
上記のコードを実行すると、すべての Cookie 情報を削除できます。
上記はCookieの最も基本的な操作です。しかし、まだ注意しなければならないことがたくさんあります:
一个Cookie只能标识一种字符串信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。就是说cookie 总是 名=值的形式保存。
在默认的情况下,我们创建多个的cookie,将保存在同一个文件中.
一个WEB站点可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie, 每个站点最多存放20个,每个Cookie的大小限制在4K,但是不同的浏览器,情况可能不同。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用setcookie()函数的第三个参数设置时间,并给出一个以秒为单位的时间。要删除 cookie 需要确保它的失效期是在过去,才能触发浏览器的删除机制。 就是说,我们的cookie默认的生命周期就是一个会话周期。如果希望设置,就需要 setcookie(‘name’, ‘val’, 时间)
如果希望cookie长久有效,可以这样创建cookie setCookie(“key”,”val”,PHP_INT_MAX);
我们可以看到在操作cookie的时候,都是通过setcookie进行不同的设置,但是我们在查帮助文档的时候,可以看到setcookie的参数并不是三个,而是可以七个参数。
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
而我们上面使用的就是前三个参数,设置键和值,同时设置保存的时间。
在setcookie()函数中第四个参数是控制cookie的有效路径的,当我们不设置的时候,默认的是当前路径和后台路径有效,但是当我们设置成’/’的时候,cookie全站有效。
案例目录结构:
...test |_readcookie.php(读取cookie信息) |_abc |_createcookie.php(创建cookie) |_def |_readcookie.php(读取cookie);
两个readcookie.php代码一样:
<?php echo '<pre class="brush:php;toolbar:false">'; var_dump($_COOKIE);
创建cookie的代码:
<?php //创建cookie保存数据 setcookie('user','abc',time() + 1600,''); //再创建一个cookie信息,这两个cookie会保存在一个cookie文件里面 setcookie('password','123',time() + 1600,'/');
创建cookie的时候,第一个键值使用默认的有效路径第二个键值使用全站的有效路径。
当访问test目录下的readcookie.php文件时,只能显示password-123的键值信息。
array(1) { ["password"]=> string(3) "123" }
我们在开发中可能出现在一个网站(www.test.com)下面有两个域(www.a.test.com,www.b.test.com)名,如果我们不对cookie进行设置,这两个域名是不能互相访问对方的cookie的,但是如果我们对cookie进行设置,就可以实现域名共享。而setcookie()的第五个参数就是控制域名共享的。
<?php //设置第五个参数表示两个域名可以共享cookie数据。 setcookie('username','abc','','','.test.com');
在我们在浏览网页的时候,大多数使用的的协议是HTTP协议,但是还有一种协议是HTTPs协议,这种协议比http协议更加安全,在开发中有时候当我们需要对某些重要的cookie数据必须在https协议下才能被传输,这是就会用到setcookie()函数的第六个参数进行设置。
<?php //第五个参数设置为false表示可以在http协议和https协议下传输。 setcookie('username','abc','','','',false); //第五个参数设置为false表示只能在https协议下传输。 setcookie('password','123','','','',true);
在默认情况下,cookie值是可以被其他脚本获取的,比如是JavaScript,这是就可能存在安全问题,那我们怎么防止其他脚本来读取cookie呢?
在setcookie()函数的最后一个参数就是控制cookie只能http协议进行读取。
<?php //最后一个参数,设置为true表示只能是https协议进行读取。 setcookie('username','abc','','','',false,false);
上面的就是对会话技术cookie的介绍。在会话技术中还有之中技术也就是session。
在我们登录网页时,输入正确的账号和密码后,我们可以使用会话技术的session技术进行保存数据。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session文件,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务
当我们在服务器需要创建一个session的时候,会在服务器创建一个session文件,并且每个会话独享一份session文件,在服务器session文件默认存在在 c:/windows/temp 目录, 但是我们也可以在php.ini中进行修改。当服务器创建session后,会在返回数据的时候把session的id号封装到http协议的响应头中。
SetCookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70; path=/
这个响应信息和创建cookie的信息很想,但是浏览器并不会在浏览器的缓存中创建cookie文件。当浏览器保存住session的ID后,如果又要访问网页,浏览器会把session的ID封装在请求头中发送给服务器。
Cookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70
session的操作大致也可以分为增删改查四个步骤。
但是不管是什么操作都需要在操作前开启session机制,使用sessio_start()函数进行开启。同时session数据的保存也是通过键值对的方式进行保存的。session保存的数据类型可以是int,float,boolean,string,array,object。
<?php //开启session机制 session_start(); //把数据保存在$_SESSION数组里面。 $_SESSION['user'] = 'abc';
先开启session机制,然后把需要的数据保存在$_SESSION数组里面当我们运行代码可以在http协议的响应头中添加了一段话:
Set-Cookie:PHPSESSID=p4lsn4vrdjtmkou1qc3tn3n577; path=/
同时我们也可以参看我们在服务器保存的session文件。
user|s:3:"abc";
<?php //先开启session机制 session_start(); echo '<pre class="brush:php;toolbar:false">'; //保存在session里面的数据会自动封装到$_SESSION数组里面 var_dump($_SESSION); ......结果...... array(1) { ["user"]=> string(3) "abc" }
当我们读取session的数据的时候,先开启session机制,这样服务器就会把session文件里面的数据封装到$_SESSION数组中,从而就可以对数据进行操作。
session的修改和cookie的修改是一样的,session怎么创建,就怎么修改,如果数据不存在就创建,如果数据存在就修改。
当我们不需要某些session数据的时候,我们可以进行数据的删除,当然,我们可以删除一个数据,也可以删除全部数据,甚至也可以删除session文件。
<?php session_start(); // if(isset($_SESSION['user'])){ // //删除其中一个数据 // unset($_SESSION['user']); // } // //通过循环删除全部的数据。 // foreach ($_SESSION as $key => $value) { // unset($_SESSION[$key]); // } //删除session文件 session_destroy();
我们可以根据自己的需求进行不同数据的删除。
从上面的讲解中可以看到操作session的函数并不像cookie一样只是一个函数,关于session的操作函数有许多。
在上面我们都是使用了session_start()函数来启动session机制,其实PHP给我们提供了两种方式来开启session
直接在php文件中使用session_start()函数;这种方式比较灵活,推荐使用这种方式。
直接在php.ini 文件中,配置session.auto_start = 1 设置1就可以自动打开session机制. 默认情况下这个值是 0,这种方式不推荐使用。
关于session的安全和cookie的安全设置一样,但是session不是通过函数的参数进行设置的,而是在php.ini文件中进行配置的。其中有几个关键的值:
session.save_path:session数据保存在服务器的路径。
session.cookie_secure:这个参数的作用和cookie很像,在传输给服务器时,是否安全传输,即是否使用https传输。
session.cookie_httponly:只能http协议进行读取。
session.cookie_domain:在传输给服务器时,有效域名的设置。
上面的参数我们都是直接在php.ini配置里面修改的,这种修改是永久性的,但有时我们要求只是临时的修改php.ini文件,就可以使用ini_set()函数进行配置。ini_set函数可以去临时修改php.ini 的设置,而且设置只对当前的这个会话有影响。但是有一点ini_set函数要在 session_start()前,才能生效.
在上面我们在使用session的时候,只是简单的进行session_start()函数开启session机制,并且把数据封装到$_SESSION数组里面,但是我们并没有了解其中的过程,数据是怎么存储在数组里面,又是在什么时候保存在session文件中的,当destroy掉session文件的时候又是在哪里进行执行的,都没有了解。
session的存储机制大致可以分为三步,从session_start开始,到一个文件运行结束
在session_start()开启session机制后,
判断浏览器传过来的数据中是否带有session_id,如果有就使用,没有就创建一个session文件。
将session文件中的数据读取到$_SESSION数组中。
启用session的垃圾回收机制,判断哪些session是失效的,删除失效的session文件。
在脚本周期内,我们可以对$_SESSION数组进行增删改查的操作,注意在这里操作的数据并不会对保存在服务器端的session文件有影响。同时如果在这里使用session_destroy(),就会删除session文件并关闭session机制。
スクリプトの最後で、まずセッション メカニズムが閉じられているかどうかを確認します。閉じられていない場合は、$_SESSION 配列内のデータがセッション ファイルに書き込まれます。
上記はセッションのストレージメカニズムです。ストレージメカニズムを理解してマスターすることは、セッションを使用するのに非常に役立ちます。
上記のストレージメカニズムでは、セッションメカニズムを開いた後の最初のステップで、どのファイルが無効であるかを判断し、その後、セッションはリサイクルのためにガベージコレクションメカニズム(GC)を有効にすることがわかっています。実際、php.ini ファイルには gc を有効にする確率を設定する 2 つのパラメータがあります。
session.gc_probability
session.gc_pisor= 10000
ガベージコレクションの確率を示すペアであり、確率の計算式は session.gc_probability/ session.gc_pisor = 1/10000つまり、session_start() 関数が 10,000 回呼び出されると、ガベージ コレクション メカニズムが 1 回トリガーされます。
ただし、GC が頻繁にトリガーされるのを避けるために、大規模な Web サイトでは session.gc_pisor を 10000、中規模の Web サイトでは 500 ~ 1000、小規模な Web サイトでは 200 ~ 300 など、より大きな確率に設定します。
セッションテクノロジー Cookie とセッションは、PHP 開発において今でもよく使用されており、2 つのテクノロジーの異なる特性を理解することで、開発中にさまざまなデータをより柔軟に保存できます。
上記は、第 17 回 PHP 基本チュートリアルのセッション技術 COOKIE と SESSION の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (m.sbmmt.com) をご覧ください。