PHP를 사용하여 백엔드를 개발할 때 일부 데이터를 저장해야 하는데 일반적인 접근 방식은 다음과 같습니다. 데이터베이스를 저장하지만 때로는 데이터베이스에 저장할 필요가 없습니다. 예를 들어 웹 페이지에 로그인하면 마지막으로 웹 사이트를 방문한 시간이 웹 사이트에 표시됩니다. 방문은 데이터베이스에 저장될 필요가 없습니다. 동시에 특정 웹 페이지에 로그인한 후 로그인 사용자 이름을 데이터베이스에 저장할 필요가 없지만 PHP의 세션 기술을 사용합니다. 그것을 해결하기 위해.
PHP의 쿠키 기술과 세션 기술은 모두 세션을 위한 기술입니다. 여기서 세션은 사용자가 브라우저를 열고 웹사이트를 방문하는 순간부터 웹사이트 페이지를 닫는 순간까지를 세션이라고 합니다. 세션 중에 사용자는 웹 사이트 페이지의 다양한 하이퍼링크를 여러 번 클릭할 수 있습니다.
웹사이트와 웹사이트 내의 페이지를 방문하면 웹사이트가 시작됩니다. 그것은 단지 세션일 뿐입니다.
가끔 웹사이트를 방문할 때, 웹사이트에 접속하자마자 현재 웹사이트에 마지막으로 방문한 시간이 웹페이지에 표시되는 경우가 있습니다. 많은. 이 시간은 쿠키를 사용하여 저장될 수 있습니다.
쿠키는 클라이언트 측 기술로, 서버는 각 사용자의 데이터를 쿠키 형태로 사용자의 해당 브라우저에 기록합니다. 사용자가 브라우저를 사용하여 서버의 웹 리소스에 액세스하면 자신의 데이터도 함께 가져오게 됩니다. 이러한 방식으로 웹 리소스는 사용자 자신의 데이터를 처리합니다. 쿠키 기술은 브라우저 측에 작성된 파일이라는 점에 유의하세요. 동시에 쿠키는 키-값 쌍의 형태로 저장됩니다.
위 순서도에서 볼 수 있듯이 서버의 PHP 파일에 쿠키가 생성되면 서버는 쿠키 생성 정보를 PHP의 응답 헤더에 캡슐화합니다. http 프로토콜 정보를 전송하기 위해 브라우저는 응답 헤더를 수신한 후 이를 분석하여 서버가 브라우저에 쿠키를 생성해야 함을 알고, 브라우저가 이를 방문하면 응답 헤더의 정보를 통해 로컬로 쿠키 파일을 생성합니다. 다시 웹사이트를 방문하면 로컬 쿠키 정보가 서버로 전송됩니다.
Cookie:user=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
쿠키의 사용은 간단히 말해서 쿠키의 추가, 삭제, 수정, 확인 등을 하는 행위로 이해하시면 됩니다.
쿠키 생성은 사실 매우 간단합니다
rreesetcookie() 함수를 통해 쿠키를 생성하고 쿠키가 저장됩니다. 서버 캐시의 브라우저에서.
<?php //通过setcookie函数进行cookie的创建 setcookie('username','abc',time()+3600);
setcookie(매개변수 1, 매개변수 2, 매개변수 3) 코드에서 세 개의 매개변수가 이 함수에 전달되는 것을 볼 수 있습니다.
첫 번째 파라미터는 정보를 저장할 키 이름입니다.
두 번째 매개변수는 키에 해당하는 값
세 번째 매개변수는 이 쿠키가 저장되는 시간이고, 여기에 저장되는 시간은 현재 시간에 3600초를 더한 값입니다. 이 시간을 초과하면 쿠키가 만료됩니다.
위 코드의 실행이 완료되면 저장된 데이터가 포함된 브라우저의 캐시 파일에서 생성된 쿠키 파일을 확인할 수 있습니다.
Set-Cookie:username=abc; expires=Mon, 17-Oct-2016 08:55:51 GMT; Max-Age=3600
위에서 데이터를 저장한 목적은 데이터를 읽는 것이며, 쿠키를 읽는 것은 다음과 같이 이해될 수 있습니다. :
http 프로토콜에 따라 브라우저가 웹사이트의 페이지를 요청할 때: 브라우저는 http 요청을 통해 웹사이트의 쿠키 정보를 서버의 요청 페이지로 보냅니다. 🎜>
username abc www.lijiafei.com/test3/ 1536 2120470400 30550100 480638768 30550092 *
<?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:user=abc; username=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
<?php //通过setcookie函数进行修改,但是如果浏览器没有cookie则进行创建。 setcookie('username','abc123',time() + 1600);
수동으로 파기할 수 있습니다. 쿠키 데이터 삭제는 1. 브라우저 캐시에 저장된 쿠키 파일을 삭제하고, 2. 서버 $_COOKIE 배열에 저장된 데이터를 삭제하는 두 단계로 이해될 수 있습니다.
array(3) { ["user"]=> string(3) "abc" ["username"]=> string(6) "abc123" ["PHPSESSID"]=> string(26) "v6ntsa42f4v0h5jpaoa1tot8r6" } abc123
一个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 활성화 가능성을 설정하는 두 가지 매개 변수가 있습니다.
session.gc_probability
session.gc_pisor= 10000
쌍입니다. 가비지 컬렉션 확률은 얼마인가요? 확률 계산 공식은 session.gc_probability/session.gc_pisor = 1/10000입니다. 즉, session_start() 함수가 10,000번 호출되면 가비지 컬렉션 메커니즘이 실행됩니다. 한 번.
그러나 대규모 웹사이트의 경우 GC가 자주 발생하지 않도록 session.gc_pisor를 10000, 중형 웹사이트 500-1000, 소규모 웹사이트 200-300과 같이 더 크게 설정합니다. .
세션 기술인 쿠키와 세션은 PHP 개발에서 여전히 많이 사용됩니다. 두 기술의 서로 다른 특성을 이해하면 보다 유연하게 개발할 수 있습니다. 다른 데이터를 저장합니다.
위 내용은 PHP Basic Tutorial 17의 세션 기술인 COOKIE와 SESSION에 대한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!