Maison développement back-end tutoriel php Zend Framework实现将session存储在memcache中的方法_PHP

Zend Framework实现将session存储在memcache中的方法_PHP

May 27, 2016 am 10:34 AM
framework session zend

本文实例讲述了Zend Framework实现将session存储在memcache中的方法。分享给大家供大家参考,具体如下:

在zend framework中,已经可以将session存储在数据库中了,不过还不支持memcache,我简单得实现了一下。

下面是SaveHandler,文件名为 :Memcached.php ,将其放在 /Zend/Session/SaveHandler 目录下,代码如下(需要有php_memcache支持,因为字符长度限制,我把部分注释去掉了):

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

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

require_once 'Zend/Session.php';

require_once 'Zend/Config.php';

class Zend_Session_SaveHandler_Memcached implements Zend_Session_SaveHandler_Interface

{

  const LIFETIME     = 'lifetime';

  const OVERRIDE_LIFETIME = 'overrideLifetime';

  const MEMCACHED      = 'memcached';

  protected $_lifetime = false;

  protected $_overrideLifetime = false;

  protected $_sessionSavePath;

  protected $_sessionName;

  protected $_memcached;

  /**

   * Constructor

   *

   * $config is an instance of Zend_Config or an array of key/value pairs containing configuration options for

   * Zend_Session_SaveHandler_Memcached . These are the configuration options for

   * Zend_Session_SaveHandler_Memcached:

   *

   *

   *   sessionId    => The id of the current session

   *   sessionName   => The name of the current session

   *   sessionSavePath => The save path of the current session

   *

   * modified      => (string) Session last modification time column

   *

   * lifetime     => (integer) Session lifetime (optional; default: ini_get('session.gc_maxlifetime'))

   *

   * overrideLifetime => (boolean) Whether or not the lifetime of an existing session should be overridden

   *   (optional; default: false)

   *

   * @param Zend_Config|array $config   User-provided configuration

   * @return void

   * @throws Zend_Session_SaveHandler_Exception

   */

  public function __construct($config)

  {

    if ($config instanceof Zend_Config) {

      $config = $config->toArray();

    } else if (!is_array($config)) {

      /**

       * @see Zend_Session_SaveHandler_Exception

       */

      require_once 'Zend/Session/SaveHandler/Exception.php';

      throw new Zend_Session_SaveHandler_Exception(

        '$config must be an instance of Zend_Config or array of key/value pairs containing '

       . 'configuration options for Zend_Session_SaveHandler_Memcached .');

    }

    foreach ($config as $key => $value) {

      do {

        switch ($key) {

          case self::MEMCACHED:

            $this->createMemcached($value);

            break;

          case self::LIFETIME:

            $this->setLifetime($value);

            break;

          case self::OVERRIDE_LIFETIME:

            $this->setOverrideLifetime($value);

            break;

          default:

            // unrecognized options passed to parent::__construct()

            break 2;

        }

        unset($config[$key]);

      } while (false);

    }

  }

  /**

   * 创建memcached连接对象

   *

   * @return void

   */

  public function createMemcached($config){

   $mc = new Memcache;

   foreach ($config as $value){

    $mc->addServer($value['ip'], $value['port']);

   }

   $this->_memcached = $mc;

  }

  public function __destruct()

  {

    Zend_Session::writeClose();

  }

  /**

   * Set session lifetime and optional whether or not the lifetime of an existing session should be overridden

   *

   * $lifetime === false resets lifetime to session.gc_maxlifetime

   *

   * @param int $lifetime

   * @param boolean $overrideLifetime (optional)

   * @return Zend_Session_SaveHandler_Memcached

   */

  public function setLifetime($lifetime, $overrideLifetime = null)

  {

    if ($lifetime < 0) {

      /**

       * @see Zend_Session_SaveHandler_Exception

       */

      require_once 'Zend/Session/SaveHandler/Exception.php';

      throw new Zend_Session_SaveHandler_Exception();

    } else if (empty($lifetime)) {

      $this->_lifetime = (int) ini_get('session.gc_maxlifetime');

    } else {

      $this->_lifetime = (int) $lifetime;

    }

    if ($overrideLifetime != null) {

      $this->setOverrideLifetime($overrideLifetime);

    }

    return $this;

  }

  /**

   * Retrieve session lifetime

   *

   * @return int

   */

  public function getLifetime()

  {

    return $this->_lifetime;

  }

  /**

   * Set whether or not the lifetime of an existing session should be overridden

   *

   * @param boolean $overrideLifetime

   * @return Zend_Session_SaveHandler_Memcached

   */

  public function setOverrideLifetime($overrideLifetime)

  {

    $this->_overrideLifetime = (boolean) $overrideLifetime;

    return $this;

  }

  public function getOverrideLifetime()

  {

    return $this->_overrideLifetime;

  }

  /**

   * Retrieve session lifetime considering

   *

   * @param array $value

   * @return int

   */

  public function open($save_path, $name)

  {

    $this->_sessionSavePath = $save_path;

    $this->_sessionName   = $name;

    return true;

  }

  /**

   * Retrieve session expiration time

   *

   * @param * @param array $value

   * @return int

   */

  public function close()

  {

    return true;

  }

  public function read($id)

  {

    $return = '';

    $value = $this->_memcached->get($id); //获取数据

    if ($value) {

      if ($this->_getExpirationTime($value) > time()) {

        $return = $value['data'];

      } else {

        $this->destroy($id);

      }

    }

    return $return;

  }

  public function write($id, $data)

  {

    $return = false;

    $insertDate = array('modified' => time(),

               'data'   => (string) $data);

      $value = $this->_memcached->get($id); //获取数据

    if ($value) {

      $insertDate['lifetime'] = $this->_getLifetime($value);

      if ($this->_memcached->replace($id,$insertDate)) {

        $return = true;

      }

    } else {

      $insertDate['lifetime'] = $this->_lifetime;

      if ($this->_memcached->add($id, $insertDate,false,$this->_lifetime)) {

        $return = true;

      }

    }

    return $return;

  }

  public function destroy($id)

  {

    $return = false;

    if ($this->_memcached->delete($id)) {

      $return = true;

    }

    return $return;

  }

  public function gc($maxlifetime)

  {

    return true;

  }

  protected function _getLifetime($value)

  {

    $return = $this->_lifetime;

    if (!$this->_overrideLifetime) {

      $return = (int) $value['lifetime'];

    }

    return $return;

  }

  protected function _getExpirationTime($value)

  {

    return (int) $value['modified'] + $this->_getLifetime($value);

  }

}

Copier après la connexion

配置(可以添加多台memcache服务器,做分布式):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$config = array(

  'memcached'=> array(

    array(

      'ip'=>'192.168.0.1',

      'port'=>11211

    )

  ),

  'lifetime' =>123334

);

//create your Zend_Session_SaveHandler_DbTable and

//set the save handler for Zend_Session

Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($config));

//start your session!

Zend_Session::start();

Copier après la connexion

配置好后,session的使用方法和以前一样,不用管底层是怎么实现的!

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Problèmes d'installation de Microsoft NET Framework, code d'erreur 0x800c0006, correctif Problèmes d'installation de Microsoft NET Framework, code d'erreur 0x800c0006, correctif May 05, 2023 pm 04:01 PM

.NET Framework 4 est requis par les développeurs et les utilisateurs finaux pour exécuter les dernières versions des applications sous Windows. Cependant, lors du téléchargement et de l'installation de .NET Framework 4, de nombreux utilisateurs se sont plaints de l'arrêt du programme d'installation à mi-chemin, affichant le message d'erreur suivant : « .NET Framework 4 n'a pas été installé car le téléchargement a échoué avec le code d'erreur 0x800c0006 ». Si vous le rencontrez également lors de l'installation de .NETFramework4 sur votre appareil, vous êtes au bon endroit

Comment identifier les problèmes de mise à niveau de Windows à l'aide de SetupDiag sous Windows 11/10 Comment identifier les problèmes de mise à niveau de Windows à l'aide de SetupDiag sous Windows 11/10 Apr 17, 2023 am 10:07 AM

Chaque fois que votre PC Windows 11 ou Windows 10 rencontre un problème de mise à niveau ou de mise à jour, vous verrez généralement un code d'erreur indiquant la raison réelle de l'échec. Cependant, une confusion peut parfois survenir lorsqu'une mise à niveau ou une mise à jour échoue sans qu'un code d'erreur ne s'affiche. Grâce à des codes d'erreur pratiques, vous savez exactement où se situe le problème afin que vous puissiez essayer de le résoudre. Mais comme aucun code d’erreur n’apparaît, il devient difficile d’identifier le problème et de le résoudre. Cela prendra beaucoup de temps pour simplement découvrir la raison de l'erreur. Dans ce cas, vous pouvez essayer d'utiliser un outil dédié appelé SetupDiag fourni par Microsoft qui vous aide à identifier facilement la véritable raison de l'erreur.

Comment définir le délai d'expiration de la session dans SpringBoot Session Comment définir le délai d'expiration de la session dans SpringBoot Session May 15, 2023 pm 02:37 PM

Le problème a été détecté dans le délai d'expiration de la session de production du projet Springboot. Le problème est décrit ci-dessous : Dans l'environnement de test, la sortie de session a été configurée en modifiant le fichier application.yaml après avoir défini différentes heures pour vérifier la configuration de la sortie de session. est entré en vigueur, le délai d'expiration a été directement fixé à 8 heures pour la sortie. Arrivé en environnement de production. Cependant, j'ai reçu à midi des commentaires de clients indiquant que le délai d'expiration du projet était court. Si aucune opération n'est effectuée pendant une demi-heure, la session expirera et nécessitera des connexions répétées. Résolvez le problème de la gestion de l'environnement de développement : le projet Springboot intègre Tomcat, donc la sortie de session configurée dans application.yaml dans le projet est efficace. Environnement de production : la version de l'environnement de production est

Comment résoudre l'échec de la session Comment résoudre l'échec de la session Oct 18, 2023 pm 05:19 PM

L'échec de la session est généralement dû à l'expiration de la durée de vie de la session ou à l'arrêt du serveur. Les solutions : 1. Prolonger la durée de vie de la session ; 2. Utiliser le stockage persistant ; 3. Utiliser les cookies ; 4. Mettre à jour la session de manière asynchrone ; 5. Utiliser un middleware de gestion de session ;

Que dois-je faire si la session php disparaît après l'actualisation ? Que dois-je faire si la session php disparaît après l'actualisation ? Jan 18, 2023 pm 01:39 PM

Solution au problème de disparition de la session php après l'actualisation : 1. Ouvrez la session via "session_start();" ; 2. Écrivez toutes les configurations publiques dans un fichier php ; 3. Le nom de la variable ne peut pas être le même que l'indice du tableau ; 4. Dans Vérifiez simplement le chemin de stockage des données de session dans phpinfo et vérifiez si la session dans le répertoire de fichiers est enregistrée avec succès.

Solution au problème inter-domaines de session PHP Solution au problème inter-domaines de session PHP Oct 12, 2023 pm 03:00 PM

Solution au problème inter-domaines de PHPSession Dans le développement de la séparation front-end et back-end, les requêtes inter-domaines sont devenues la norme. Lorsque nous traitons de problèmes interdomaines, nous impliquons généralement l'utilisation et la gestion de sessions. Cependant, en raison des restrictions de la politique d'origine du navigateur, les sessions ne peuvent pas être partagées par défaut entre les domaines. Afin de résoudre ce problème, nous devons utiliser certaines techniques et méthodes pour réaliser le partage de sessions entre domaines. 1. L'utilisation la plus courante des cookies pour partager des sessions entre domaines

SCNotification a cessé de fonctionner [5 étapes pour y remédier] SCNotification a cessé de fonctionner [5 étapes pour y remédier] May 17, 2023 pm 09:35 PM

En tant qu'utilisateur Windows, vous rencontrerez probablement une erreur SCNotification a cessé de fonctionner à chaque démarrage de votre ordinateur. SCNotification.exe est un fichier de notification système Microsoft qui plante à chaque démarrage de votre PC en raison d'erreurs d'autorisation et de pannes de réseau. Cette erreur est également connue sous son nom d’événement problématique. Vous ne verrez donc peut-être pas cela comme un arrêt de SCNotification, mais comme un bug clr20r3. Dans cet article, nous explorerons toutes les étapes à suivre pour réparer SCNotification a cessé de fonctionner afin qu'il ne vous dérange plus. Qu'est-ce que SCNotification.e

Quel est le délai d'expiration par défaut de la session PHP ? Quel est le délai d'expiration par défaut de la session PHP ? Nov 01, 2022 am 09:14 AM

Le délai d'expiration par défaut de la session PHP est de 1440 secondes, soit 24 minutes, ce qui signifie que si le client ne s'actualise pas pendant plus de 24 minutes, la session en cours expirera si l'utilisateur ferme le navigateur, la session se terminera et la session PHP expirera. La session n'existera plus.

See all articles