Jadual Kandungan
前言:
1、创建会话表
2、定义会话函数:
3、使用新会话处理程序
4、测试使用
Rumah pembangunan bahagian belakang tutorial php PHP数据库保存session会话

PHP数据库保存session会话

Apr 03, 2018 am 11:10 AM
php session pangkalan data

本篇文章介绍的是关于PHP数据库保存session会话,现在分享给大家,也可以给有需要的朋友一个参考,大家一起来看一看吧


前言:


在默认的情况下,PHP会把全部的会话数据保存在服务器上的文本文件里面,这些文件通常都是保存在服务器上的临时目录里边。

那为什么我们要把session会话保存在数据库中呢?

  1. 主要原因:提高系统的安全性。在共享服务器上,在没有进行特别的设置,所有的网站站点都会使用同一个临时目录,这意味着数十个程序都在同一个位置对文件进行读写操作。不仅速度下降了,而且别人也有可能窃取到我的站点的用户数据。

  2. 把会话数据保存到数据库还可以更方便的搜索web站点会话的更多信息,我们可以查询活动会话的数量(同时在线的用户量),还可以对会话数据进行备份。

  3. 假如我的站点同时运行于多个服务器,那么某个用户在一个会话过程中,可能会对不同的服务器发送多个请求,但是会话数据如果保存在某一个服务器上,那么其他服务器就不能使用到这些会话数据。假如我的某一台服务器仅仅是数据库的角色,那你把会话数据全保存在数据库中,不是很方便么?

更多的关于PHP session的理解可以参考该博客 彻底理解PHP的SESSION机制 

1、创建会话表

由于 session 数据是保存在服务器上面的,而在客户端中保存的是一个索引(sessionID),这个索引对应于服务器上的某一条 session 数据。因此该表必须包含的两个字段是 id、data,还有就是会话会有过期时间,所以在这里还有个字段就是 last_accessed,这里我把该表建在test数据库下:

CREATE TABLE sessions(
    id CHAR(32) NOT NULL,
    data TEXT,
    last_accessed TIMESTAMP NOT NULL,    PRIMARY KEY(id)
);
Salin selepas log masuk

这里写图片描述

PS:如果程序需要在会话保存大量的数据,则 data 字段可能就需要定义为 MEDIUMTEXT 或 LONGTEXT 类型了。

2、定义会话函数:

这里我们主要有两个步骤:

  1. 定义与数据库交互的函数

  2. 使PHP能使用这些自定义函数

在第二步中,是通过调用函数 session_set_save_handler()来完成的,调用它需要6个参数,分别是 open(启动会话)、close(关闭会话)、read(读取会话)、write(写入会话)、destroy(销毁会话)、clean(垃圾回收)。

我们新建php文件 sessions.inc.php ,代码如下:

<?php$sdbc = null;  //数据库连接句柄,在后面的函数里面让它成为全局变量//启动会话function open_session(){
    global $sdbc;      //使用全局的$sdbc
    $sdbc = mysqli_connect(&#39;localhost&#39;, &#39;root&#39;, &#39;lsgogroup&#39;, &#39;test&#39;);     //数据库 test
    if (!$sdbc) {        return false;
    }    return true;
}//关闭会话function close_session(){
    global $sdbc;    return mysqli_close($sdbc);
}//读取会话数据function read_session($sid){
    global $sdbc;    $sql = sprintf("SELECT data FROM sessions WHERE id=&#39;%s&#39;", mysqli_real_escape_string($sdbc, $sid));    $res = mysqli_query($sdbc, $sql);    if (mysqli_num_rows($res) == 1) {        list($data) = mysqli_fetch_array($res, MYSQLI_NUM);        return $data;
    } else {        return &#39;&#39;;
    }
}//写入会话数据function write_session($sid, $data){
    global $sdbc;    $sql = sprintf("INSERT INTO sessions(id,data,last_accessed) VALUES(&#39;%s&#39;,&#39;%s&#39;,&#39;%s&#39;)", mysqli_real_escape_string($sdbc, $sid), mysqli_real_escape_string($sdbc, $data), date("Y-m-d H:i:s", time()));    $res = mysqli_query($sdbc, $sql);    if (!$res) {        return false;
    }    return true;
}//销毁会话数据function destroy_session($sid){
    global $sdbc;    $sql = sprintf("DELETE FROM sessions WHERE id=&#39;%s&#39;", mysqli_real_escape_string($sdbc, $sid));    $res = mysqli_query($sdbc, $sql);    $_SESSION = array();    if (!mysqli_affected_rows($sdbc) == 0) {        return false;
    }    return true;
}//执行垃圾回收(删除旧的会话数据)function clean_session($expire){
    global $sdbc;    $sql = sprintf("DELETE FROM sessions WHERE DATE_ADD(last_accessed,INTERVAL %d SECOND)<NOW()", (int)$expire);    $res = mysqli_query($sdbc, $sql);    if (!$res) {        return false;
    }    return true;
}//告诉PHP使用会话处理函数session_set_save_handler(&#39;open_session&#39;, &#39;close_session&#39;, &#39;read_session&#39;, &#39;write_session&#39;, &#39;destroy_session&#39;, &#39;clean_session&#39;);//启动会话,该函数必须在session_set_save_handler()函数后调用,不然我们所定义的函数就没法起作用了。session_start();//由于该文件被包含在需要使用会话的php文件里面,因此不会为其添加PHP结束标签
Salin selepas log masuk

PS:

  1. 处理“读取”函数外,其他函数必须返回一个布尔值,“读取”函数必须返回一个字符串。

  2. .每次会话启动时,“打开”和“读取”函数将会立即被调用。当“读取”函数被调用的时候,可能会发生垃圾回收过程。

  3. 当脚本结束时,“写入”函数就会被调用,然后就是“关闭”函数,除非会话被销毁了,而这种情况下,“写入”函数不会被调用。但是,在“关闭”函数之后,“销毁”函数将会被调用。

  4. .session_set_save_handler()函数参数顺序不能更改,因为它们一一对应 open 、close、read、、、、

  5. 会话数据最后将会以数据序列化的方式保存在数据库中。

3、使用新会话处理程序

使用新会话处理程序只是调用session_set_save_handler()函数,使我们的自定义函数能够被自动调用而已。其他关于会话的操作都没有发生变化(以前怎么用现在怎么用,我们的函数会在后台自动被调用),包括在会话中存储数据,访问保存的会话数据以及销毁数据。

在这里,我们新建 sessions.php 文件,该脚本将在没有会话信息时创建一些会话数据,并显示所有的会话数据,在用户点击 ‘log out’(注销)时销毁会话数据。

代码:

<?php//引入sessions.inc.php文件,即上面的代码require(&#39;sessions.inc.php&#39;);?><!doctype html><html lang=&#39;en&#39;><head>
    <meta charset="utf-8">
    <title>DB session test</title></head><body><?php//创建会话数据if(empty($_SESSION)){    $_SESSION[&#39;blah&#39;] = "umlaut";    $_SESSION[&#39;this&#39;] = 12345;    $_SESSION[&#39;that&#39;] = &#39;blue&#39;;    echo "<p>Session data stored</p>";
}else{    echo "<p>Session data exists:<pre class="brush:php;toolbar:false">".print_r($_SESSION,1)."

"; }if(isset($_GET['logout'])){ //销毁会话数据 session_destroy(); echo "

session destroyed

"; }else{ echo "log out"; }echo "

session data :

".print_r($_SESSION,1)."

";echo ''; session_write_close(); //下面重点解析?>
Salin selepas log masuk

解析 session_write_close():

顾名思义,该函数就是先写入会话数据,然后关闭session会话,按道理这两步在脚本执行完后会自动执行,为什么我们还要显式调用它呢?因为这里涉及到了数据库的连接!

由于我们知道,PHP会在脚本执行完后自动关闭数据库的所有连接,而同时会话函数会尝试向数据库写入数据并关闭连接。这样一来就会导致会话数据没法写入数据库,并且出现一大堆错误,例如write_session()、close_session()函数中都有用到数据库的连接。

为了避免以上说的问题,我们在脚本执行完之前调用 session_write_close()函数,他就会调用“写入”函数和“关闭”函数,而此时数据库连接还是存在的!

PS:在使用header()函数重定向浏览器之前也应该调用session_write_close()函数,假如有数据库的操作时!

4、测试使用

在浏览器中打开 sessions.php,刷新页面,然后再看看数据库有没有添加数据。在另一个浏览器打开 sessions.php ,看看数据库中有没有添加另一条数据。。。。。

本博客主要是参考自《深入理解PHP高级技巧、面向对象与核心技术》,希望能帮到大家。

相关推荐:

PHP开发Session原理以及使用详解



Atas ialah kandungan terperinci PHP数据库保存session会话. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

See all articles