目錄
基于redis的处理session的方法,redis处理session
首頁 php教程 php手册 基于redis的处理session的方法,redis处理session

基于redis的处理session的方法,redis处理session

Jun 13, 2016 am 08:44 AM
單一登入

基于redis的处理session的方法,redis处理session

一个基于redis的处理session的方法,如下。

<span> 1</span> <?<span>php
</span><span> 2</span> <span>class</span><span> Session_custom {
</span><span> 3</span>     <span>private</span> <span>$redis</span>; <span>//</span><span> redis实例</span>
<span> 4</span>     <span>private</span> <span>$prefix</span> = 'sess_'; <span>//</span><span> session_id前缀
</span><span> 5</span>     
<span> 6</span> <span>    // 会话开始时,会执行该方法,连接redis服务器</span>
<span> 7</span>     <span>public</span> <span>function</span> open(<span>$path</span>, <span>$name</span><span>) {
</span><span> 8</span>         <span>$this</span>->redis = <span>new</span><span> Redis();
</span><span> 9</span>         <span>return</span> <span>$this</span>->redis->connect("127.0.0.1",6379<span>);
</span><span>10</span> <span>    }
</span><span>11</span>     
<span>12</span>     <span>//</span><span> 会话结束时,调用该方法,关闭redis连接</span>
<span>13</span>     <span>public</span> <span>function</span><span> close() {
</span><span>14</span>         <span>$this</span>->redis-><span>close();
</span><span>15</span>         <span>return</span> <span>true</span><span>;
</span><span>16</span> <span>    }
</span><span>17</span>     
<span>18</span>     <span>//</span><span> 会话保存数据时调用该方法,在脚本执行完或session_write_close方法调用之后调用</span>
<span>19</span>     <span>public</span> <span>function</span> write(<span>$session_id</span>, <span>$data</span><span>) {
</span><span>20</span>         <span>return</span> <span>$this</span>->redis->hMSet(<span>$this</span>->prefix.<span>$session_id</span>, <span>array</span>('expires' => <span>time</span>(), 'data' => <span>$data</span><span>));
</span><span>21</span> <span>    }
</span><span>22</span>     
<span>23</span>     <span>//</span><span> 在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。</span>
<span>24</span>     <span>public</span> <span>function</span> read(<span>$session_id</span><span>) {
</span><span>25</span>         <span>if</span>(<span>$this</span>->redis->exists(<span>$this</span>->prefix.<span>$session_id</span><span>)) {
</span><span>26</span>             <span>return</span> <span>$this</span>->redis->hGet(<span>$this</span>->prefix.<span>$session_id</span>, 'data'<span>);
</span><span>27</span> <span>        }
</span><span>28</span>         <span>return</span> ''<span>;
</span><span>29</span> <span>    }
</span><span>30</span>     
<span>31</span>     <span>//</span><span> 清除会话中的数据,当调用session_destroy()函数,或者调用 session_regenerate_id()函数并且设置 destroy 参数为 TRUE 时,会调用此回调函数。</span>
<span>32</span>     <span>public</span> <span>function</span> destroy(<span>$session_id</span><span>) {
</span><span>33</span>         <span>if</span>(<span>$this</span>->redis->exists(<span>$this</span>->prefix.<span>$session_id</span><span>)) {
</span><span>34</span>             <span>return</span> <span>$this</span>->redis->del(<span>$this</span>->prefix.<span>$session_id</span>) > 0 ? <span>true</span> : <span>false</span><span>;
</span><span>35</span> <span>        }
</span><span>36</span>         <span>return</span> <span>true</span><span>;
</span><span>37</span> <span>    }
</span><span>38</span>     
<span>39</span>     <span>//</span><span> 垃圾回收函数,调用周期由 session.gc_probability 和 session.gc_divisor 参数控制</span>
<span>40</span>     <span>public</span> <span>function</span> gc(<span>$maxlifetime</span><span>) {
</span><span>41</span>         <span>$allKeys</span> = <span>$this</span>->redis->keys("{<span>$this</span>->prefix}*"<span>);
</span><span>42</span>         <span>foreach</span>(<span>$allKeys</span> <span>as</span> <span>$key</span><span>) {
</span><span>43</span>             <span>if</span>(<span>$this</span>->redis->exists(<span>$key</span>) && <span>$this</span>->redis->hGet(<span>$key</span>, 'expires') + <span>$maxlifetime</span> < <span>time</span><span>()) {
</span><span>44</span>                 <span>$this</span>->redis->del(<span>$key</span><span>);
</span><span>45</span> <span>            }
</span><span>46</span> <span>        }
</span><span>47</span>         <span>return</span> <span>true</span><span>;
</span><span>48</span> <span>    }
</span><span>49</span> <span>}
</span><span>50</span> 
<span>51</span> <span>//</span><span> 调用自定义的session处理方法</span>
<span>52</span> <span>$handler</span> = <span>new</span><span> Session_custom();
</span><span>53</span> <span>session_set_save_handler</span><span>(
</span><span>54</span>     <span>array</span>(<span>$handler</span>, 'open'),
<span>55</span>     <span>array</span>(<span>$handler</span>, 'close'),
<span>56</span>     <span>array</span>(<span>$handler</span>, 'read'),
<span>57</span>     <span>array</span>(<span>$handler</span>, 'write'),
<span>58</span>     <span>array</span>(<span>$handler</span>, 'destroy'),
<span>59</span>     <span>array</span>(<span>$handler</span>, 'gc'<span>)
</span><span>60</span> <span>);
</span><span>61</span> 
<span>62</span> <span>//</span><span> 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为,表示当脚本执行之后或调用exit()之后,存储当前会话数据并关闭当前会话</span>
<span>63</span> <span>register_shutdown_function</span>('session_write_close'<span>);
</span><span>64</span> 
<span>65</span> <span>session_start</span><span>();
</span><span>66</span> 
<span>67</span> <span>//</span><span> 可以使用session了</span>
登入後複製

补充:

php.ini文件中的session.gc_probability与session.gc_divisor两个配置选项共同决定gc函数调用的时机。默认值分为为1和1000,表示每个请求只有1/1000的机会调用gc函数。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用PHP實現高效穩定的SSO單一登錄 如何使用PHP實現高效穩定的SSO單一登錄 Oct 15, 2023 pm 02:49 PM

如何使用PHP實現高效穩定的SSO單一登入引言:隨著網路應用的普及,使用者面臨大量的註冊和登入流程。為了提高使用者體驗,並減少使用者的註冊和登入間隔,許多網站和應用程式開始採用單一登入(SingleSign-On,簡稱SSO)技術。本文將介紹如何使用PHP實現高效穩定的SSO單一登錄,並提供具體的程式碼範例。一、SSO單一登入原理SSO單一登入是一種身分認證的解決

GitLab的權限管理與單一登入整合技巧 GitLab的權限管理與單一登入整合技巧 Oct 21, 2023 am 11:15 AM

GitLab的權限管理和單一登入整合技巧,需要具體程式碼範例概述:在GitLab中,權限管理和單一登入(SSO)是非常重要的功能。權限管理可以控制使用者對程式碼倉庫、專案和其他資源的存取權限,而單一登入整合可以提供更方便的使用者認證和授權方式。本文將介紹如何在GitLab中進行權限管理和單一登入整合。一、權限管理專案存取權限控制在GitLab中,專案可以設定為私有

如何設計一個安全的MySQL表結構來實現單一登入功能? 如何設計一個安全的MySQL表結構來實現單一登入功能? Oct 31, 2023 am 08:33 AM

如何設計一個安全的MySQL表結構來實現單一登入功能?隨著互聯網的發展,用戶在不同的應用程式中需要登入不同的帳戶成為一種常見情況。為了提升使用者體驗與便利性,單一登入(SingleSign-On,簡稱SSO)技術應運而生。 SSO技術使得用戶可以透過一次登入存取多個應用程序,避免了頻繁輸入帳戶和密碼的麻煩。在設計一個安全的MySQL表結構來實現單一登入功能

如何使用PHP和OAuth進行單一登入 如何使用PHP和OAuth進行單一登入 Jul 29, 2023 pm 12:37 PM

如何使用PHP和OAuth進行單一登入在現代的網站和應用程式中,單一登入(SingleSign-On,簡稱SSO)已成為非常重要的功能。它允許用戶只需一次登入即可存取多個系統,大大提高了用戶體驗和工作效率。本文將介紹如何使用PHP和OAuth協定進行單一登入的實作。一、OAuth簡介OAuth是一種開放標準的授權協議,用於讓使用者授權第三方應用訪問

聊聊基於Node實作單一登入(SSO)的方法 聊聊基於Node實作單一登入(SSO)的方法 Dec 06, 2022 pm 07:49 PM

什麼是單一登入?原理是什麼?怎麼實現?以下這篇文章帶大家了解單一登錄,並聊聊使用Node實作單一登入SSO的方法,希望對大家有幫助!

基於Swoole的SSO單一登入系統設計實踐 基於Swoole的SSO單一登入系統設計實踐 Jun 14, 2023 pm 04:08 PM

隨著網路的高速發展,越來越多的網站和應用程式需要實現使用者單一登入(SingleSign-On,SSO)功能,以提供更便利和安全的使用者體驗。在此背景下,基於Swoole的SSO單一登入系統逐漸成為了業界關注的熱點。本文將為大家介紹如何設計實作一個基於Swoole的SSO單一登入系統。一、SSO單一登入系統設計想法SSO單一登入系統目的是實現使用者在一個系統中登

深入理解PHP SSO單一登入的工作原理與技術機制 深入理解PHP SSO單一登入的工作原理與技術機制 Oct 15, 2023 am 09:19 AM

深入理解PHPSSO單一登入的工作原理和技術機制隨著網路的快速發展,各種網站和應用程式的數量也日益增加。使用者為了造訪不同的網站和應用,需要分別註冊不同的帳號和密碼,給使用者帶來了不便和麻煩。為了解決這個問題,單一登入(SingleSign-On,SSO)應運而生。 SSO是一種授權認證系統,在使用者登入成功後,可以實現使用者在多個系統中的無縫存取。本文將深入理解P

如何利用PHP函數實現使用者登入和登出的單一登入和權限驗證? 如何利用PHP函數實現使用者登入和登出的單一登入和權限驗證? Jul 26, 2023 pm 07:02 PM

如何利用PHP函數實現使用者登入和登出的單一登入和權限驗證?隨著網路的發展,越來越多的網站或應用程式需要使用者登入來獲得更多的個人化服務或提升使用者體驗。而對於多個網站或應用,如果每個都要進行單獨的登入和權限驗證,將給使用者帶來不便。因此,單一登入(SingleSign-On,簡稱SSO)的概念應運而生。本文將介紹使用PHP函數實作單一登入和權限驗證的方法,並提供相

See all articles