Inhaltsverzeichnis
session放入缓存(redis)、DB,sessionredis
为什么要把SESSION保存在缓存
SESSION保存在缓存中
Heim php教程 php手册 session放入缓存(redis)、DB,sessionredis

session放入缓存(redis)、DB,sessionredis

Jun 13, 2016 am 09:16 AM
redis

session放入缓存(redis)、DB,sessionredis

为什么要把SESSION保存在缓存

  就php来说,语言本身支持的session是以文件的方式保存到磁盘文件中,保存在指定的文件夹中,保存的路径可以在配置文件中设置或者在程序中使用函数session_save_path()进行设置,但是这么做有弊端,

1

2

<p>第一就是保存到文件系统中,效率低,只要有用到session就会从好多个文件中查找指定的sessionid,效率很低。</p>

<p>第二就是当用到多台服务器的时候可能会出现,session丢失问题(其实是保存在了其他服务器上)。</p>

Nach dem Login kopieren

  当然了,保存在缓存中可以解决上面的问题,如果使用php本身的session函数,可以使用session_set_save_handler()函数很方便的对session的处理过程进行重新控制。如果不用php的session系列函数,可以自己编写个类似的session函数,也是可以的,我现在做的这个项目就是这样,会根据用户的mid、登录时间进行求hash作为sessionId,每次请求的时候都必须加上sessionId才算合法(第一次登录的时候是不需要的,这个时候会创建sessionId,返回给客户端),这么做也很方便、简洁高效的。当然了,我这篇文章主要说的是在php自身的SESSION中”做做手脚”。

SESSION保存在缓存中

  php将缓存保存到redis中,可以使用配置文件,对session的处理和保存做修改,当然了,在程序中使用ini_set()函数去修改也可以,这个很方便测试,我这里就使用这种方式,当然了,要是生产环境还是建议使用配置文件。

1

2

3

4

5

6

7

8

9

10

11

<?<span>php

</span><span>ini_set</span>("session.save_handler", "redis"<span>);

</span><span>ini_set</span>("session.save_path", "tcp://localhost:6379"<span>);

</span><span>session_start</span><span>();

</span><span>header</span>("Content-type:text/html;charset=utf-8"<span>);

</span><span>if</span>(<span>isset</span>(<span>$_SESSION</span>['view'<span>])){

    </span><span>$_SESSION</span>['view'] = <span>$_SESSION</span>['view'] + 1<span>;

}</span><span>else</span><span>{

    </span><span>$_SESSION</span>['view'] = 1<span>;

}

</span><span>echo</span> "【view】{<span>$_SESSION</span>['view']}";

Nach dem Login kopieren

  这里设置session.save_handler方式为redis,session.save_path为redis的地址和端口,设置之后刷新,再回头查看redis,会发现redis中的生成了sessionId,sessionId和浏览器请求的是一样的,

open(string $savePath, string $sessionName); //open类似于构造函数,开始会话的时候会调用,比如使用session_start()函数之后

close(); //类似于类的析构函数,在write函数调用之后调用,session_write_close()之后之后也会执行

read(string $sessionId); //读取session的时候调用

write(string $sessionId, string $data); //保存数据的时候调用

destory($sessionId); //销毁会话的时候(session_destory()或者session_regenerate_id())会调用

gc($lifeTime); //垃圾清理函数,清理掉过期作废的数据

  主要就是实现这几个方法,根据不同的存储驱动可以自己设置不同的具体方法,我实现了mysql数据库和redis这两种保存session的驱动,如果有需要的话可以自己去扩展,扩展很方便很容易。

  下面是我的redis的实现(db和redis差不多,redis代码少,贴出来):

  我使用了接口的方式,这样扩展起来更方便,那天想用memcached了,直接添加就行了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

<?<span>php

</span><span>include_once</span> __DIR__."/interfaceSession.php"<span>;

</span><span>/*</span><span>*

 * 以db的方式存储session

 </span><span>*/</span>

<span>class</span> redisSession <span>implements</span><span> interfaceSession{

    </span><span>/*</span><span>*

     * 保存session的数据库表的信息

     </span><span>*/</span>

    <span>private</span> <span>$_options</span> = <span>array</span><span>(

        </span>'handler' => <span>null</span>, <span>//</span><span>数据库连接句柄</span>

        'host' => <span>null</span>,

        'port' => <span>null</span>,

        'lifeTime' => <span>null</span>,<span>

    );

 

    </span><span>/*</span><span>*

     * 构造函数

     * @param $options 设置信息数组

     </span><span>*/</span>

    <span>public</span> <span>function</span> __construct(<span>$options</span>=<span>array</span><span>()){

        </span><span>if</span>(!<span>class_exists</span>("redis", <span>false</span><span>)){

            </span><span>die</span>("必须安装redis扩展"<span>);

        }

        </span><span>if</span>(!<span>isset</span>(<span>$options</span>['lifeTime']) || <span>$options</span>['lifeTime'] <= 0<span>){

            </span><span>$options</span>['lifeTime'] = <span>ini_get</span>('session.gc_maxlifetime'<span>);

        }

        </span><span>$this</span>->_options = <span>array_merge</span>(<span>$this</span>->_options, <span>$options</span><span>);

    }

 

    </span><span>/*</span><span>*

     * 开始使用该驱动的session

     </span><span>*/</span>

    <span>public</span> <span>function</span><span> begin(){

        </span><span>if</span>(<span>$this</span>->_options['host'] === <span>null</span> ||

           <span>$this</span>->_options['port'] === <span>null</span> ||

           <span>$this</span>->_options['lifeTime'] === <span>null</span><span>

        ){

            </span><span>return</span> <span>false</span><span>;

        }

        </span><span>//</span><span>设置session处理函数</span>

        <span>session_set_save_handler</span><span>(

            </span><span>array</span>(<span>$this</span>, 'open'),

            <span>array</span>(<span>$this</span>, 'close'),

            <span>array</span>(<span>$this</span>, 'read'),

            <span>array</span>(<span>$this</span>, 'write'),

            <span>array</span>(<span>$this</span>, 'destory'),

            <span>array</span>(<span>$this</span>, 'gc'<span>)

        );

    }

    </span><span>/*</span><span>*

     * 自动开始回话或者session_start()开始回话后第一个调用的函数

     * 类似于构造函数的作用

     * @param $savePath 默认的保存路径

     * @param $sessionName 默认的参数名,PHPSESSID

     </span><span>*/</span>

    <span>public</span> <span>function</span> open(<span>$savePath</span>, <span>$sessionName</span><span>){

        </span><span>if</span>(<span>is_resource</span>(<span>$this</span>->_options['handler'])) <span>return</span> <span>true</span><span>;

        </span><span>//</span><span>连接redis</span>

        <span>$redisHandle</span> = <span>new</span><span> Redis();

        </span><span>$redisHandle</span>->connect(<span>$this</span>->_options['host'], <span>$this</span>->_options['port'<span>]);

        </span><span>if</span>(!<span>$redisHandle</span><span>){

            </span><span>return</span> <span>false</span><span>;

        }

 

        </span><span>$this</span>->_options['handler'] = <span>$redisHandle</span><span>;

        </span><span>$this</span>->gc(<span>null</span><span>);

        </span><span>return</span> <span>true</span><span>;

 

    }

 

    </span><span>/*</span><span>*

     * 类似于析构函数,在write之后调用或者session_write_close()函数之后调用

     </span><span>*/</span>

    <span>public</span> <span>function</span><span> close(){

        </span><span>return</span> <span>$this</span>->_options['handler']-><span>close();

    }

 

    </span><span>/*</span><span>*

     * 读取session信息

     * @param $sessionId 通过该Id唯一确定对应的session数据

     * @return session信息/空串

     </span><span>*/</span>

    <span>public</span> <span>function</span> read(<span>$sessionId</span><span>){

        </span><span>return</span> <span>$this</span>->_options['handler']->get(<span>$sessionId</span><span>);

    }

 

    </span><span>/*</span><span>*

     * 写入或者修改session数据

     * @param $sessionId 要写入数据的session对应的id

     * @param $sessionData 要写入的数据,已经序列化过了

     </span><span>*/</span>

    <span>public</span> <span>function</span> write(<span>$sessionId</span>, <span>$sessionData</span><span>){

        </span><span>return</span> <span>$this</span>->_options['handler']->setex(<span>$sessionId</span>, <span>$this</span>->_options['lifeTime'], <span>$sessionData</span><span>);

    }

 

    </span><span>/*</span><span>*

     * 主动销毁session会话

     * @param $sessionId 要销毁的会话的唯一id

     </span><span>*/</span>

    <span>public</span> <span>function</span> destory(<span>$sessionId</span><span>){

        </span><span>return</span> <span>$this</span>->_options['handler']->delete(<span>$sessionId</span>) >= 1 ? <span>true</span> : <span>false</span><span>;

    }

 

    </span><span>/*</span><span>*

     * 清理绘画中的过期数据

     * @param 有效期

     </span><span>*/</span>

    <span>public</span> <span>function</span> gc(<span>$lifeTime</span><span>){

        </span><span>//</span><span>获取所有sessionid,让过期的释放掉</span>

        <span>$this</span>->_options['handler']->keys("*"<span>);

        </span><span>return</span> <span>true</span><span>;

    }

 

}</span>

Nach dem Login kopieren

  看看简单工厂模式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<span>class</span><span> session {

    </span><span>/*</span><span>*

     * 驱动程序句柄保存

     </span><span>*/</span>

    <span>private</span> <span>static</span> <span>$_handler</span> = <span>null</span><span>;

 

    </span><span>/*</span><span>*

     * 创建session驱动程序

     </span><span>*/</span>

    <span>public</span> <span>static</span> <span>function</span> getSession(<span>$type</span>, <span>$options</span><span>){

        </span><span>//</span><span>单例</span>

        <span>if</span>(<span>isset</span>(<span>$handler</span><span>)){

            </span><span>return</span> self::<span>$_handler</span><span>;

        }

 

        </span><span>switch</span> (<span>$type</span><span>) {

            </span><span>case</span> 'db': <span>//</span><span>数据库驱动session类型</span>

                    <span>include_once</span> __DIR__."/driver/dbSession.php"<span>;

                    </span><span>$handler</span> = <span>new</span> dbSession(<span>$options</span><span>);

                </span><span>break</span><span>;

             

            </span><span>case</span> 'redis': <span>//</span><span>redis驱动session类型</span>

                    <span>include_once</span> __DIR__."/driver/redisSession.php"<span>;

                    </span><span>$handler</span> = <span>new</span> redisSession(<span>$options</span><span>);

                </span><span>break</span><span>;

            </span><span>default</span>:

                    <span>return</span> <span>false</span><span>;

                </span><span>break</span><span>;

        }

 

        </span><span>return</span> self::<span>$_handler</span> = <span>$handler</span><span>;

    }

}</span>

Nach dem Login kopieren

  调用也很简单,

1

2

3

4

5

6

session::getSession('redis',<span>array</span><span>(

        </span>'host' => "localhost",

        'port' => "6379",<span>

    ))</span>-><span>begin();

 

</span><span>session_start</span>();

Nach dem Login kopieren

  数据库版本的也一样很简单就可以配置,需要的话可以在这里下载完整版和demo

 

 

  本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So erstellen Sie den Redis -Clustermodus So erstellen Sie den Redis -Clustermodus Apr 10, 2025 pm 10:15 PM

Der Redis -Cluster -Modus bietet Redis -Instanzen durch Sharding, die Skalierbarkeit und Verfügbarkeit verbessert. Die Bauschritte sind wie folgt: Erstellen Sie ungerade Redis -Instanzen mit verschiedenen Ports; Erstellen Sie 3 Sentinel -Instanzen, Monitor -Redis -Instanzen und Failover; Konfigurieren von Sentinel -Konfigurationsdateien, Informationen zur Überwachung von Redis -Instanzinformationen und Failover -Einstellungen hinzufügen. Konfigurieren von Redis -Instanzkonfigurationsdateien, aktivieren Sie den Cluster -Modus und geben Sie den Cluster -Informationsdateipfad an. Erstellen Sie die Datei nodes.conf, die Informationen zu jeder Redis -Instanz enthält. Starten Sie den Cluster, führen Sie den Befehl erstellen aus, um einen Cluster zu erstellen und die Anzahl der Replikate anzugeben. Melden Sie sich im Cluster an, um den Befehl cluster info auszuführen, um den Clusterstatus zu überprüfen. machen

So löschen Sie Redis -Daten So löschen Sie Redis -Daten Apr 10, 2025 pm 10:06 PM

So löschen Sie Redis -Daten: Verwenden Sie den Befehl Flushall, um alle Schlüsselwerte zu löschen. Verwenden Sie den Befehl flushdb, um den Schlüsselwert der aktuell ausgewählten Datenbank zu löschen. Verwenden Sie SELECT, um Datenbanken zu wechseln, und löschen Sie dann FlushDB, um mehrere Datenbanken zu löschen. Verwenden Sie den Befehl del, um einen bestimmten Schlüssel zu löschen. Verwenden Sie das Redis-Cli-Tool, um die Daten zu löschen.

So verwenden Sie den Befehl Redis So verwenden Sie den Befehl Redis Apr 10, 2025 pm 08:45 PM

Die Verwendung der REDIS -Anweisung erfordert die folgenden Schritte: Öffnen Sie den Redis -Client. Geben Sie den Befehl ein (Verbschlüsselwert). Bietet die erforderlichen Parameter (variiert von der Anweisung bis zur Anweisung). Drücken Sie die Eingabetaste, um den Befehl auszuführen. Redis gibt eine Antwort zurück, die das Ergebnis der Operation anzeigt (normalerweise in Ordnung oder -err).

So verwenden Sie ein einzelnes Gewinde -Redis So verwenden Sie ein einzelnes Gewinde -Redis Apr 10, 2025 pm 07:12 PM

Redis verwendet eine einzelne Gewindearchitektur, um hohe Leistung, Einfachheit und Konsistenz zu bieten. Es wird E/A-Multiplexing, Ereignisschleifen, nicht blockierende E/A und gemeinsame Speicher verwendet, um die Parallelität zu verbessern, jedoch mit Einschränkungen von Gleichzeitbeschränkungen, einem einzelnen Ausfallpunkt und ungeeigneter Schreib-intensiver Workloads.

So lesen Sie den Quellcode von Redis So lesen Sie den Quellcode von Redis Apr 10, 2025 pm 08:27 PM

Der beste Weg, um Redis -Quellcode zu verstehen, besteht darin, Schritt für Schritt zu gehen: Machen Sie sich mit den Grundlagen von Redis vertraut. Wählen Sie ein bestimmtes Modul oder eine bestimmte Funktion als Ausgangspunkt. Beginnen Sie mit dem Einstiegspunkt des Moduls oder der Funktion und sehen Sie sich die Codezeile nach Zeile an. Zeigen Sie den Code über die Funktionsaufrufkette an. Kennen Sie die von Redis verwendeten Datenstrukturen. Identifizieren Sie den von Redis verwendeten Algorithmus.

So implementieren Sie die zugrunde liegenden Redis So implementieren Sie die zugrunde liegenden Redis Apr 10, 2025 pm 07:21 PM

Redis verwendet Hash -Tabellen, um Daten zu speichern und unterstützt Datenstrukturen wie Zeichenfolgen, Listen, Hash -Tabellen, Sammlungen und geordnete Sammlungen. Ernähren sich weiterhin über Daten über Snapshots (RDB) und appendiert Mechanismen nur Schreibmechanismen. Redis verwendet die Master-Slave-Replikation, um die Datenverfügbarkeit zu verbessern. Redis verwendet eine Ereignisschleife mit einer Thread, um Verbindungen und Befehle zu verarbeiten, um die Datenatomizität und Konsistenz zu gewährleisten. Redis legt die Ablaufzeit für den Schlüssel fest und verwendet den faulen Löschmechanismus, um den Ablaufschlüssel zu löschen.

So lesen Sie Redis -Warteschlange So lesen Sie Redis -Warteschlange Apr 10, 2025 pm 10:12 PM

Um eine Warteschlange aus Redis zu lesen, müssen Sie den Warteschlangenname erhalten, die Elemente mit dem Befehl LPOP lesen und die leere Warteschlange verarbeiten. Die spezifischen Schritte sind wie folgt: Holen Sie sich den Warteschlangenname: Nennen Sie ihn mit dem Präfix von "Warteschlange:" wie "Warteschlangen: My-Queue". Verwenden Sie den Befehl LPOP: Wischen Sie das Element aus dem Kopf der Warteschlange aus und geben Sie seinen Wert zurück, z. B. die LPOP-Warteschlange: my-queue. Verarbeitung leerer Warteschlangen: Wenn die Warteschlange leer ist, gibt LPOP NIL zurück, und Sie können überprüfen, ob die Warteschlange existiert, bevor Sie das Element lesen.

So verwenden Sie Redis Lock So verwenden Sie Redis Lock Apr 10, 2025 pm 08:39 PM

Um die Operationen zu sperren, muss die Sperre durch den Befehl setNX erfasst werden und dann den Befehl Ablauf verwenden, um die Ablaufzeit festzulegen. Die spezifischen Schritte sind: (1) Verwenden Sie den Befehl setNX, um zu versuchen, ein Schlüsselwertpaar festzulegen; (2) Verwenden Sie den Befehl Ablauf, um die Ablaufzeit für die Sperre festzulegen. (3) Verwenden Sie den Befehl Del, um die Sperre zu löschen, wenn die Sperre nicht mehr benötigt wird.

See all articles