首页 后端开发 php教程 将Session写入数据库

将Session写入数据库

Aug 08, 2016 am 09:26 AM
handler self session time

使用session_set_save_handler()函数,将Session的内容写入数据库

<span>  1</span> <span>php
</span><span>  2</span>     <span>/*</span>
<span>  3</span> <span>    *@author    Fahy
</span><span>  4</span> <span>    *@link    http://home.cnblogs.com/u/HuangWj
</span><span>  5</span> <span>    *数据库为mysql,
</span><span>  6</span> <span>    *数据库名为session,表名为session,
</span><span>  7</span> <span>    *表中字段包括PHPSESSID,update_time,client_ip,data
</span><span>  8</span>     <span>*/</span>
<span>  9</span>     <span>class</span><span> Session{
</span><span> 10</span>         <span>private</span> <span>static</span> <span>$handler</span> = <span>null</span><span>;
</span><span> 11</span>         <span>private</span> <span>static</span> <span>$ip</span> = <span>null</span><span>;
</span><span> 12</span>         <span>private</span> <span>static</span> <span>$lifetime</span> = <span>null</span><span>;
</span><span> 13</span>         <span>private</span> <span>static</span> <span>$time</span> = <span>null</span><span>;
</span><span> 14</span>         
<span> 15</span>         <span>//</span><span>配置静态变量</span>
<span> 16</span>         <span>private</span> <span>static</span> <span>function</span> init(<span>$handler</span><span>){
</span><span> 17</span>             self::<span>$handler</span> = <span>$handler</span>;        <span>//</span><span>获取数据库资源</span>
<span> 18</span>             self::<span>$ip</span> = !<span>empty</span>(<span>$_SERVER</span>["REMOTE_ADDR"])? <span>$_SERVER</span>["REMOTE_ADDR"]:'unkonw';        <span>//</span><span>获取客户端ip</span>
<span> 19</span>             self::<span>$lifetime</span> = <span>ini_get</span>('session.gc_maxlifetime');        <span>//</span><span>获取session生命周期</span>
<span> 20</span>             self::<span>$time</span> = <span>time</span>();        <span>//</span><span>获取当前时间</span>
<span> 21</span> <span>        }
</span><span> 22</span>         <span>//</span><span>调用session_set_save_handler()函数并开启session</span>
<span> 23</span>         <span>static</span> <span>function</span> start(<span>$pdo</span><span>){
</span><span> 24</span>             self::init(<span>$pdo</span><span>);
</span><span> 25</span>             <span>session_set_save_handler</span><span>(
</span><span> 26</span>                 <span>array</span>(<span>__CLASS__</span>,'open'),
<span> 27</span>                 <span>array</span>(<span>__CLASS__</span>,'close'),
<span> 28</span>                 <span>array</span>(<span>__CLASS__</span>,'read'),
<span> 29</span>                 <span>array</span>(<span>__CLASS__</span>,'write'),
<span> 30</span>                 <span>array</span>(<span>__CLASS__</span>,'destroy'),
<span> 31</span>                 <span>array</span>(<span>__CLASS__</span>,'gc'<span>)
</span><span> 32</span> <span>            );
</span><span> 33</span>             <span>session_start</span><span>();
</span><span> 34</span> <span>        }
</span><span> 35</span>         
<span> 36</span>         <span>public</span> <span>static</span> <span>function</span> open(<span>$path</span>,<span>$name</span><span>){
</span><span> 37</span>             <span>return</span> <span>true</span><span>;
</span><span> 38</span> <span>        }
</span><span> 39</span>         <span>public</span> <span>static</span> <span>function</span><span> close(){
</span><span> 40</span>             <span>return</span> <span>true</span><span>;
</span><span> 41</span> <span>        }
</span><span> 42</span>         
<span> 43</span>         <span>//</span><span>查询数据库中的数据</span>
<span> 44</span>         <span>public</span> <span>static</span> <span>function</span> read(<span>$PHPSESSID</span><span>){
</span><span> 45</span>              <span>$sql</span> = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"<span>;
</span><span> 46</span>              <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 47</span>              <span>$stmt</span>->execute(<span>array</span>(<span>$PHPSESSID</span><span>));
</span><span> 48</span>              <span>if</span>(!<span>$result</span> = <span>$stmt</span>->fetch(PDO::<span>FETCH_ASSOC)){
</span><span> 49</span>                  <span>return</span> ''<span>;
</span><span> 50</span> <span>             }
</span><span> 51</span>              <span>if</span>(self::<span>$ip</span> == <span>$result</span>['client_ip'<span>]){
</span><span> 52</span>                  self::destroy(<span>$PHPSESSID</span><span>);
</span><span> 53</span>                  <span>return</span> ''<span>;
</span><span> 54</span> <span>             }
</span><span> 55</span>              <span>if</span>((<span>$result</span>['update_time']+self::<span>$lifetime</span>)<:>$time<span>){
</span><span> 56</span>                  self::destroy(<span>$PHPSESSID</span><span>);
</span><span> 57</span>                  <span>return</span> ''<span>;
</span><span> 58</span> <span>             }
</span><span> 59</span>              <span>return</span> <span>$result</span>['data'<span>];
</span><span> 60</span> <span>        }
</span><span> 61</span>         <span>/*</span>
<span> 62</span> <span>         *首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据
</span><span> 63</span>          <span>*/</span>
<span> 64</span>         <span>//</span><span>将session写入数据库中,$data传入session中的keys和values数组</span>
<span> 65</span>         <span>public</span> <span>static</span> <span>function</span> write(<span>$PHPSESSID</span>,<span>$data</span><span>){
</span><span> 66</span>             <span>$sql</span> = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"<span>;
</span><span> 67</span>              <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 68</span>              <span>$stmt</span>->execute(<span>array</span>(<span>$PHPSESSID</span><span>));
</span><span> 69</span>              
<span> 70</span>              <span>if</span>(<span>$result</span>=<span>$stmt</span>->fetch(PDO::<span>FETCH_ASSOC)){                
</span><span> 71</span>                  <span>if</span>(<span>$result</span>['data'] != <span>$data</span> || self::<span>$time</span> > (<span>$result</span>['update_time']+30<span>)){
</span><span> 72</span>                      <span>$sql</span> = "update session set update_time=?,data=? where PHPSESSID = ?"<span>;
</span><span> 73</span>                      <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 74</span>                      <span>$stmt</span>->execute(<span>array</span>(<span>$self</span>::<span>$time</span>,<span>$data</span>,<span>$PHPSESSID</span><span>));
</span><span> 75</span> <span>                }
</span><span> 76</span>              }<span>else</span><span>{
</span><span> 77</span>                  <span>if</span>(!<span>empty</span>(<span>$data</span><span>)){
</span><span> 78</span>                      <span>try</span><span>{
</span><span> 79</span>                          <span>$sql</span> = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)"<span>;
</span><span> 80</span>                      }<span>catch</span>(PDOException <span>$e</span><span>){
</span><span> 81</span>                          <span>echo</span> <span>$e</span>-><span>getMessage();
</span><span> 82</span> <span>                     }
</span><span> 83</span>                      <span>$sth</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 84</span>                      <span>$sth</span>->execute(<span>array</span>(<span>$PHPSESSID</span>,self::<span>$time</span>,self::<span>$ip</span>,<span>$data</span><span>));
</span><span> 85</span> <span>                 }
</span><span> 86</span> <span>             }
</span><span> 87</span>              <span>return</span> <span>true</span><span>;
</span><span> 88</span> <span>        }
</span><span> 89</span>         
<span> 90</span>         <span>public</span> <span>static</span> <span>function</span> destroy(<span>$PHPSESSID</span><span>){
</span><span> 91</span>             <span>$sql</span> = "delete from session where PHPSESSID = ?"<span>;
</span><span> 92</span>             <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 93</span>             <span>$stmt</span>->execute(<span>array</span>(<span>$PHPSESSID</span><span>));
</span><span> 94</span>             <span>return</span> <span>true</span><span>;
</span><span> 95</span> <span>        }
</span><span> 96</span>         <span>public</span> <span>static</span> <span>function</span> gc(<span>$lifetime</span><span>){
</span><span> 97</span>             <span>$sql</span> = "delete from session where update_time"<span>;
</span><span> 98</span>             <span>$stmt</span> = self::<span>$handler</span>->prepare(<span>$sql</span><span>);
</span><span> 99</span>             <span>$stmt</span>->execute(<span>array</span>(self::<span>$time</span>-<span>$lifetime</span><span>));
</span><span>100</span>             <span>return</span> <span>true</span><span>;
</span><span>101</span> <span>        }
</span><span>102</span> <span>    }
</span><span>103</span>     <span>//</span><span>使用PDO连接数据库</span>
<span>104</span>     <span>try</span><span>{
</span><span>105</span>         <span>$pdo</span> = <span>new</span> PDO("mysql:host=localhost;dbname=session","root","hwj193"<span>);
</span><span>106</span>     }<span>catch</span>(PDOException <span>$e</span><span>){
</span><span>107</span>         <span>echo</span> <span>$e</span>-><span>getMessage();
</span><span>108</span> <span>    }
</span><span>109</span>     <span>//</span><span>传递数据库资源</span>
<span>110</span>     Session::start(<span>$pdo</span>);</:>
登录后复制

以上就介绍了将Session写入数据库,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SpringBoot Session怎么设置会话超时 SpringBoot Session怎么设置会话超时 May 15, 2023 pm 02:37 PM

问题发现springboot项目生产session-out超时问题,描述下问题:在测试环境通过改动application.yaml配置session-out,经过设置不同时间验证session-out配置生效,于是就直接设置了过期时间为8小时发布到了生产环境。然而中午接到客户反应项目过期时间设置较短,半小时不操作就会话过期需要反复登陆。解决处理开发环境:springboot项目内置Tomcat,所以项目中application.yaml配置session-out是生效的。生产环境:生产环境发布是

session失效怎么解决 session失效怎么解决 Oct 18, 2023 pm 05:19 PM

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

为什么NameResolutionError(self.host, self, e) from e,怎么解决 为什么NameResolutionError(self.host, self, e) from e,怎么解决 Mar 01, 2024 pm 01:20 PM

报错的原因NameResolutionError(self.host,self,e)frome是由urllib3库中的异常类型,这个错误的原因是DNS解析失败,也就是说,试图解析的主机名或IP地址无法找到。这可能是由于输入的URL地址不正确,或者DNS服务器暂时不可用导致的。如何解决解决此错误的方法可能有以下几种:检查输入的URL地址是否正确,确保它是可访问的确保DNS服务器可用,您可以尝试在命令行中使用"ping"命令来测试DNS服务器是否可用尝试使用IP地址而不是主机名来访问网站如果是在代理

PHP Session 跨域问题的解决方法 PHP Session 跨域问题的解决方法 Oct 12, 2023 pm 03:00 PM

PHPSession跨域问题的解决方法在前后端分离的开发中,跨域请求已成为常态。在处理跨域问题时,我们通常会涉及到session的使用和管理。然而,由于浏览器的同源策略限制,跨域情况下默认情况下无法共享session。为了解决这个问题,我们需要采用一些技巧和方法来实现session的跨域共享。一、使用cookie跨域共享session最常

php session刷新后没有了怎么办 php session刷新后没有了怎么办 Jan 18, 2023 pm 01:39 PM

php session刷新后没有了的解决办法:1、通过“session_start();”开启session;2、把所有的公共配置写在一个php文件内;3、变量名不能和数组下标相同;4、在phpinfo里面查看session数据的存储路径,并查看该文件目录下的sessio是否保存成功即可。

session php默认失效时间是多少 session php默认失效时间是多少 Nov 01, 2022 am 09:14 AM

session php默认失效时间是1440秒,也就是24分钟,表示客户端超过24分钟没有刷新,当前session就会失效;如果用户关闭了浏览器,会话就会结束,Session就不存在了。

time包的单调时钟处理 time包的单调时钟处理 Aug 04, 2023 pm 05:45 PM

我们今天主要是来看一看golang time 包的时间应用方式。两者的一般规则是「wall time」用于告知时间,而「monotonic clock」用于测量时间;除外还有其他的时钟处理方式。

Redis的共享session应用如何实现短信登录 Redis的共享session应用如何实现短信登录 Jun 03, 2023 pm 03:11 PM

1.基于session实现短信登录1.1短信登录流程图1.2实现发送短信验证码前端请求说明:说明请求方式POST请求路径/user/code请求参数phone(电话号码)返回值无后端接口实现:@Slf4j@ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){//1.校验手机号if

See all articles