中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP自定義session處理方法保存到MySQL數據庫中

發布時間:2021-07-09 18:09:22 來源:億速云 閱讀:178 作者:chen 欄目:大數據

本篇內容介紹了“PHP自定義session處理方法保存到MySQL數據庫中”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

解構session存儲

在我們開始構建自己的session處理及存儲方法之前,理解PHP默認如何存儲session數據是很有幫助的。session數據被保存在服務器上一個很小的文件中,并關聯了一個唯一的ID,隨后被瀏覽器以cookie的形式保存在客戶端。如果cookie沒被起用,那么ID就會隨著URL被當做參數進行傳遞。無論是哪種方式,在隨后的請求中,PHP都是通過這個唯一的ID對session數據進行讀取、更新或者刪除等操作。為了便于理解這是怎么一回事,我們可以先從session數據保存的位置開始分析。對于文件形式保存的session數據,可以通過檢查php.ini中的session.save_path得知,也可以用session_save_path()函數進行輸出,如:

<?php
echo session_save_path();

輸出結果就是session數據保存的位置。如果你想更改存儲位置,可以修改php.ini配置,或者執行session_save_path()函數,參數就是新的存儲路徑。

session_save_path("/path/to/session/data");

最佳實踐:如果你自定義了session存儲路徑,那么建議把路徑選擇在網站根目錄之外,這樣可以最大限度避免非法獲取session數據。當然,你需要保證PHP程序能夠正常讀寫session文件。

現在我們已經知道了session數據存儲在哪,那我們就很容易找到對應當前訪問的session文件。session文件的命名以“sess_”為前綴,加上唯一的ID。session_id()可以獲取唯一ID值(是32位的字符串)。文件內容是以類似serialize()函數編碼的方式處理過的數據。

提醒:無論session是保存在默認路徑,還是自定義路徑或數據庫中,內容都是一樣的。我們能改變的是存儲位置,而不是存儲的內容。

session的生命周期

所有的session從session_start()開始,session文件被打開,數據已數組的形勢保存在$_SESSION變量中。當腳本執行完成之后,數據又被重新保存到session文件中。所以,當你設置了一個session值的時候,它并不是馬上就會進行存儲的。但是,你可以通過執行session_write_close()函數強制進行session數據的保存。

session_set_save_handler() 函數提供了自定義session數據存儲的機制。它需要個參數,每個參數都是一個可回調的函數,對應了session生命周期的每個階段:

  1. 打開session文件open

  2. 關閉session文件close

  3. 讀取session數據read

  4. 寫入session數據write

  5. 銷毀session destroy

  6. 垃圾回收 gc

PHP5.4之后,可以只傳遞兩個參數,第一個參數是實現了SessionHandlerInterface接口的對象,第二個參數控制是否將函數 session_write_close() 注冊為 register_shutdown_function() 函數。

自定義session處理:存儲到MySQL數據庫

創建存儲表
CREATE TABLE `hb_session` (
 `id` char(32) NOT NULL,
 `data` text NOT NULL,
 `access` int(11) unsigned NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Session類
namespace core\basic;

use core\database\DB;

class Session implements \SessionHandlerInterface
{
    public function open($save_path, $session_name)
    {
        return true;
    }

    public function close()
    {
        return true;
    }

    public function read($session_id)
    {
        $data = DB::fetch_first("select data from `" . DB::table('session') . "` where id='{$session_id}'");
        // 此處返回很重要,要么為空字符串,要么為實際數據。如果是NULL,則session保存會失敗
        return empty($data['data']) ? '' : $data['data'];
    }

    public function write($session_id, $data)
    {
        $now = time();
        $session = DB::fetch_first("select data from `" . DB::table('session') . "` where id='{$session_id}'");
        if (count($session) > 0) {
            DB::update("session", array(
                'data' => $data,
                'access' => $now
            ), "id='{$session_id}'");
        } else {
            DB::insert("session", array(
                'id' => $session_id,
                'data' => $data,
                'access' => $now
            ));
        }

        DB::affected_rows() ? true : false;
    }

    public function destroy($session_id)
    {
        DB::delete("session", "id='{$session_id}'");
        return true;
    }

    public function gc($lifetime)
    {
        $subtime = time() - $lifetime;
        DB::delete("session", "access<{$subtime}");
        return true;
    }
}

重要:請自行更改數據庫操作方式。以上代碼只在我自己的環境中可運行。

起用新session處理方式
$handler = new Session();
session_set_save_handler($handler, true);
session_start();

“PHP自定義session處理方法保存到MySQL數據庫中”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節
推薦閱讀:
  1. 等保流程
  2. 自定義session

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

积石山| 哈巴河县| 沁水县| 台州市| 磴口县| 西丰县| 安庆市| 元江| 嫩江县| 内丘县| 鹤壁市| 图木舒克市| 濮阳市| 龙川县| 永靖县| 朔州市| 沧源| 通渭县| 太谷县| 尚义县| 绥化市| 高清| 宽甸| 定结县| 从化市| 青阳县| 阿尔山市| 定远县| 永靖县| 永城市| 鹿泉市| 会同县| 宿松县| 荔浦县| 晋中市| 上蔡县| 湟源县| 凌海市| 松原市| 南城县| 安乡县|