Heim  >  Artikel  >  Backend-Entwicklung  >  So speichern Sie eine Sitzung in einer Datenbank und verwenden sie in PHP

So speichern Sie eine Sitzung in einer Datenbank und verwenden sie in PHP

不言
不言Original
2018-08-07 10:24:125832Durchsuche

So speichern Sie eine Sitzung in einer Datenbank und verwenden sie in PHP

Dieser Artikel stellt Ihnen vor, wie Sie Sitzungen in der Datenbank in PHP speichern und verwenden (mit Code). Freunde in Not können sich darauf beziehen hilft dir.

Beispielbeschreibung:

Es ist sicherer, SESSION-Datenvariablen auf der Serverseite zu speichern. Aber stellen Sie sich vor Eine große Website wie Xiaonei.com mit über 100 Millionen täglichen Besuchen und zig Millionen Benutzern. Wenn alle Benutzersitzungsdaten auf dem Server gespeichert werden, werden enorme Serverressourcen verbraucht. Wenn Programmierer große Websites erstellen, ist es daher sicher, SESSION auf der Serverseite zu speichern, aber es ist nicht die beste Wahl. Wenn die SESSION-Daten in der Datenbank gespeichert werden, kann dies den Druck auf den Server verringern und die Daten sind relativ sicher.

Empfehlungen zu verwandten Themen: PHP-Sitzung (einschließlich Bilder, Videos, Fälle)

Designprozess

Erstellen Sie zunächst eine Tabelle zum Speichern von SESSION in der MySQL-Datenbank:

Tabelle Die Tabellenstruktur mit dem Namen t_session

ist

So speichern Sie eine Sitzung in einer Datenbank und verwenden sie in PHP

Beschreibung: session_key: Ja

  • <code><span style="color:#3a3737;">session_data</span>session_data: Wird zum Speichern des serialisierten $_SESSION-Werts in [

    verwendet
  • <span style="color:#3a3737;">session_time</span><span style="color:#3a3737;">session_time</span>

    : wird zum Speichern von Zeitstempeln verwendet. Dieser Zeitstempel bezieht sich auf die Zeit()+Sitzungsgültigkeitsdauer, wenn die Die aktuelle Sitzung wurde erstellt. Es ist zu beachten, dass der Typ von session_time hier int ist, damit beim Betrieb der Datenbank ein Größenvergleich durchgeführt werden kann!

Was ist also Serialisierung?

Serialisierung ist der Prozess der Umwandlung der Zustandsinformationen eines Objekts in eine Form, die gespeichert oder übertragen werden kann. Bei der Serialisierung schreibt ein Objekt seinen aktuellen Zustand in den temporären oder dauerhaften Speicher. Später kann das Objekt neu erstellt werden, indem der Status des Objekts aus dem Speicher gelesen oder deserialisiert wird.

Zum Beispiel wird

$_SESSION[“user”]=”张三”
$_SESSION[“pwd”]=”zhangsan”

zu einem String nach der Sequenz

user|s:6:"张三";pwd|s:8:"zhangsan";

, wobei s den Typ als String und die Zahl die Länge des Strings darstellt, damit Sie dies tun können Bearbeite diese Zeichenfolge.

Der nächste Schritt ist der Haupttext

session.save_handler Definieren Sie den Namen des Handlers, der die damit verbundenen Daten speichert und abruft die Sitzung. Der Standardwert ist Dateien. Bei Einstellung auf Dateien (session.save_handler = files) wird der integrierte Mechanismus von PHP verwendet. Wenn Sie die Speichermethode anpassen möchten (z. B. Speichern in einer Datenbank), verwenden Sie session_set_save_handler(), um die Einstellungen anzupassen ,

Wovon wir hier sprechen, ist der zweite Typ.

Also müssen wir den Wert von session_set_save_handler in der php.ini-Datei in user

ändern, z Bild:

bool session_set_save_handler ( aufrufbar offen , aufrufbar $close , aufrufbar lesen , aufrufbar schreiben , aufrufbar zerstören , aufrufbar gc [, callable $create_sid [, callable validate_sid [, callable update_timestamp ]]] )

Wenn Sie es nicht ändern, Dann verwenden Sie ihn. Sie können ihn während der Sitzung ignorieren, aber wenn Sie Änderungen vornehmen, müssen Sie sich ihm stellen. Dies ist eine ganz besondere Funktion, da die Parameter allgemeiner Funktionen Variablen sind, die Parameter dieser Funktion jedoch 6 Funktionen sind (die letzten drei Parameter sind optionale Parameter und können ignoriert werden). Keine Angst, kommen Sie nacheinander:

Der erste Parameter: open(save_path,session_name), die beiden Parameter hier werden automatisch von PHP übergeben. save_path ist session.save_path, wenn session.save_handler = files ist und session_name die vom Server zur Identifizierung des Clients verwendete Sitzungs-ID ist. Wenn der Benutzer sie jedoch anpasst, werden diese beiden Parameter nicht verwendet und stellen nur eine Verbindung zur Datenbank her Die Open-Callback-Funktion ähnelt dem Konstruktor einer Klasse und wird aufgerufen, wenn die Sitzung geöffnet wird. Dies ist die erste Rückruffunktion, die nach dem automatischen oder manuellen Starten einer Sitzung durch Aufruf von session_start() aufgerufen wird. Diese Rückruffunktion gibt TRUE zurück, wenn die Operation erfolgreich ist, andernfalls gibt sie FALSE zurück.

Der zweite Parameter: close(), diese Funktion erfordert keine Parameter und wird zum Schließen der Datenbank verwendet. Die Close-Callback-Funktion ähnelt dem Destruktor einer Klasse. Wird aufgerufen, nachdem die Write-Callback-Funktion aufgerufen wurde. Wenn die Funktion session_write_close() aufgerufen wird, wird auch die Rückruffunktion close aufgerufen. Diese Rückruffunktion gibt TRUE zurück, wenn die Operation erfolgreich ist, andernfalls gibt sie FALSE zurück.

Der dritte Parameter: read($key), der Parameter hier ist die Sitzungs-ID, die automatisch von PHP übergeben wird. Voraussetzung für die Übergabe ist, dass es eine Sitzungs-ID gibt nicht, dann gibt dieser Parameter eine leere Zeichenfolge zurück. Beachten Sie, dass, wenn keine entsprechenden Daten in der Datenbank vorhanden sind, ein leerer String zurückgegeben werden muss, andernfalls wird ein Fehler gemeldet! Wenn in der Sitzung Daten vorhanden sind, muss die Leserückruffunktion eine Zeichenfolge zurückgeben, die die Sitzungsdaten codiert (serialisiert) (in diesem Fall die session_data aus der Tabelle t_session). Nach dem automatischen oder manuellen Starten der Sitzung durch Aufrufen der Funktion session_start() ruft PHP intern die Callback-Funktion read auf, um die Sitzungsdaten abzurufen. Vor dem Aufruf von read ruft PHP die Open-Callback-Funktion auf. Das Format der vom Leserückruf zurückgegebenen serialisierten Zeichenfolge muss genau mit dem Format übereinstimmen, wenn die Schreibrückruffunktion die Daten speichert. PHP deserialisiert automatisch die zurückgegebene Zeichenfolge und füllt die superglobale Variable $_SESSION.

Der vierte Parameter: write($key,$data), diese beiden Parameter werden von PHP auch automatisch an diese Funktion übergeben, $key entspricht der Sitzungs-ID, $data entspricht die aktuelle (Da die Schreibfunktion normalerweise aufgerufen wird, nachdem die Skriptausführung abgeschlossen ist) die vom Serialisierungsprozessor verarbeitete Sitzungsvariable (z. B. $_SESSION["user"]="Zhang San"$_SESSION["pwd"] oben erwähnt = „zhangsan“), wird der Prozess der Serialisierung der Sitzungsdaten von PHP gemäß dem Einstellungswert session.serialize_handler abgeschlossen. Die serialisierten Daten werden in Verbindung mit der Sitzungs-ID gespeichert. Beim Aufrufen der Leserückruffunktion zum Abrufen von Daten müssen die zurückgegebenen Daten vollständig mit den an die Schreibrückruffunktion übergebenen Daten übereinstimmen. PHP ruft diese Rückruffunktion auf, nachdem die Ausführung des Skripts abgeschlossen ist oder die Funktion session_write_close() aufgerufen wurde. Beachten Sie, dass PHP nach dem Aufruf dieser Rückruffunktion intern die Rückruffunktion zum Schließen aufruft.

HINWEIS:PHP ruft die Write-Callback-Funktion erst auf, wenn der Ausgabestream geschrieben und geschlossen wurde, sodass die Debugging-Informationen in der Write-Callback-Funktion nicht an den Browser ausgegeben werden. Wenn Sie die Debug-Ausgabe in der Callback-Funktion schreiben müssen, wird empfohlen, die Debug-Ausgabe in eine Datei zu schreiben.

第五个参数:  destroy($key),当调用 session_destroy() 函数, 或者调用 session_regenerate_id() 函数并且设置 destroy 参数为 TRUE 时, 会调用此回调函数。用来注销session对应的SESSION键值,此回调函数操作成功返回 TRUE,反之返回 FALSE。它就是人们常常在点击注销登录的时候用到的函数。后面会有这个小细节。

第六个参数:  gc(expire_time),这个函数的参数在默认机制下就是session.gc_maxlifetime设置的session有效时间。但是,user机制下session的过期时间在就是表里session_time,所以这里不需要传递参数的。为了清理会话中的旧数据,PHP 会不时的调用垃圾收集回调函数。 调用周期由 session.gc_probability 和 session.gc_pisor 参数控制。此回调函数操作成功返回 TRUE,反之返回 FALSE。

至此六个函数已经介绍完了,但是其中有许多需要说明的:

1、在open函数中本来是要传递save__path,目的是用来在这个路径下找到与session_name相对应的文件,然后通过read()函数来读取其中的数据,然后通过反序列化处理器将取到的字符串反序列化,在通过php自动填充各个$_session超全局变量。或者write函数来将序列化的数据存入这个路径下的文件。那么这里面的路径在非默认机制下难道就不需要吗,答案是肯定的*_*。当在非默认机制下,调试输出session_save_path,其结果为空值;而且如果未设置存储的路径,那被填充的$_session变量也只能在当前页面使用,而不能在别的页面使用,可以这样测试:在另一个页面利用session_start()函数打开会话,然后输出session_id和var_dump($_session),得到的是上一次浏览时服务器给客户端的session_id,但是$_session输出的是空数组(当然我这里只是大概的说一下我在验证时的过程)。其实我想说的就是我们在自定义会话存储机制的时候,是不需要自定义路径的,不然为什么还要存入数据库呢?    

那么怎么在其他页面也能读取到$_session[]里面的值呢?

 引入这个函数,即将六个 回调函数和session_set_save_handler放入一个文件里,然后在session_start()前用include()引入!

2、那他们的执行顺序是怎样呢?有点晕吧,来总结一下:首先session_start()函数打开session操作句柄,然后read函数读取数据,当脚本执行结束的时候执行write函数然后是close函数若有session_destroy()则执行完。

3、上面我提到过PHP 会在输出流写入完毕并且关闭之后才调用 write 回调函数,这个可把我玩坏啦,小编在上面可绕了不久呀,不然我也不会在write函数里调试那么久了!不过我也因此了解了register_shutdown_function这个函数,下面附上这个函数的特点吧:register_shutdown_function()是指在执行完所有PHP语句后再调用函数,不要理解成客户端关闭流浏览器页面时调用函数。

可以这样理解调用条件:
1、当页面被用户强制停止时
2、当程序代码运行超时时
3、当PHP代码执行完成时,代码执行存在异常和错误、警告

好了以上该说的都说完了,附上代码吧:

index.php用户登录界面

<?php


include("session_set_save_handler.php");//引入自定义的会话存储机制


if(isset($_GET["login"])){//判断login是否有值,若有值则要进行注销,


session_start();//只要需要 用到$_session变量的地方,就需要开启回调函数open


session_destroy();//这里就是上文提到的 小细节了,当有session_destroy的时候,它是先于read回调函数执行的


}else{


session_start();


if(isset($_SESSION["user"])){//判断此值是否有定义,若有定义则说明 存入的session还未到期,则直接转到主内容


echo "<script>alert(&#39;您不久前刚来过&#39;);window.location.href=&#39;main.php&#39;;</script>";

}

}

?>

<html>

<meta charset="utf-8">

<body>

<form action="index_ok.php" method="post">

账    户:<input type="text" name="user"><br>

密    码:<input type="text" name="pwd">

<input type="submit" name="sub">

</form>

</body>

</html>

index_ok.php表单提交处理文件

<?php


include("session_set_save_handler.php");


session_start();


if($_POST["sub"]){//$_post["sub"]它若有值就是 提交查询


echo $_POST["sub"];


if($_POST["user"]!=""&&$_POST["pwd"]!=""){


$_SESSION["user"]=$_POST["user"];


$_SESSION["pwd"]=$_POST["pwd"];//这里自定义的会话管理机制将会调用回调函数write,将已由序列化处理器处理好的(由$_session[]变量形成)字符串写入数据库


echo "<script>alert(&#39;登录成功!&#39;);window.location.href=&#39;main.php&#39;;</script>";

}

}


?>

main.php主内容页

<?php


include("session_set_save_handler.php");


session_start();


if(isset($_SESSION["user"])){


echo "欢迎".$_SESSION["user"];

echo "<a href=&#39;index.php?login=0&#39;>注销</a>";


}else{


echo "您还没登录,请先登录!";

echo "<a href=&#39;index.php&#39;>登录</a>";

}


?>

session_set_save_handler.php自定义session存储机制函数文件

<?php

//打开会话

function open(){


global $con;//使用全局变量


$con=mysqli_connect("localhost","root","123456","mysql")or die("数据库连接失败!");


mysqli_query($con,"set names utf8");


return(true);


}

//关闭数据库

function close(){


global $con;


mysqli_close($con);


return(true);


}

//读取session_data

function read($key){


global $con;

$time=time();

//不读取已过期的session

$sql="select session_data from t_session where session_key=&#39;$key&#39; and session_time>$time";


$result=mysqli_query($con,$sql)or die("查询失败!");


if (!$result) {//用来检查出现再数据库部分的错误,很有用


printf("Error: %s\n", mysqli_error($con));//%s表示的是字符串,这是c里面的


exit();

}


$row=mysqli_fetch_array($result);//or die()会终止后面的程序!


if($row!=false){


return($row["session_data"]);


}else{


return "";//再次强调如果空值 ,则一定 要返回”“而不是false


}


}

//存储session

function write($key,$data){



global $con;




$over_time=time()+60;//注意time()为时间戳,在mysql中的数据类型不可用用date,datetime,timestamp来存储


$sql="select session_data from t_session where session_key=&#39;$key&#39;";


$re=mysqli_query($con,$sql);


$result=mysqli_fetch_array($re);


//若$result为false,即结果 为空,说明数据库中未存有相应的session_id,那么就插入,如果不为空,那即使还有未过期的session_id,这是应更新


if($result==false){




$sql="insert into t_session(session_key,session_data,session_time ) values(&#39;$key&#39;,&#39;$data&#39;,$over_time)";//字符串的时候要加单引号,数字的时候是不用加的


$result=mysqli_query($con,$sql);


if (!$result) {//用来检查出现再数据库部分的错误,很有用

printf("Error: %s\n", mysqli_error($con));//%s表示的是字符串,这是c里面的

exit();

}




}else{




$sql="update t_session set session_key=&#39;$key&#39;,session_data=&#39;$data&#39;,session_time=$over_time where session_key=&#39;$key&#39;";


$result=mysqli_query($con,$sql);

}




return($result);


}

清楚相应的session数据

function destroy($key){




global $con;


$sql="delete from t_session where session_key=&#39;$key&#39;";


$result=mysqli_query($con,$sql);


return($result);


}


//执行垃圾回收


function overdue($expire_time){//这个参数是自动传进去的,就是session.gc_maxlifetime最大有效时间,例如1440s;


global $con;


$time=time();


$sql="delete from t_session where session_time<$time";


$result=mysqli_query($sql);


return($result);


}


session_set_save_handler(&#39;open&#39;,&#39;close&#39;,&#39;read&#39;,&#39;write&#39;,&#39;destroy&#39;,&#39;overdue&#39;);


?>

相关文章推荐:

php使用PHPMailer如何发送邮件(附代码)

PHP中常用的一些功能总结(归纳)

Das obige ist der detaillierte Inhalt vonSo speichern Sie eine Sitzung in einer Datenbank und verwenden sie in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn