温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在PHP中使用Redis共享Session

发布时间:2021-02-08 15:05:13 来源:亿速云 阅读:328 作者:Leah 栏目:开发技术

这篇文章给大家介绍如何在PHP中使用Redis共享Session,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1. 通过php自身session配置实现

# 使用 redis 作为存储方案 session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379" # 若设置了连接密码, 则使用如下 session.save_path = "tcp://127.0.0.1:6379?auth=密码"

测试代码

<?php ini_set("session.save_handler", "redis"); ini_set("session.save_path", "tcp://127.0.0.1:6379"); session_start(); echo "<pre>"; $_SESSION['usertest'.rand(1,5)]=1; var_dump($_SESSION); echo "</pre>";

输出 ↓

array(2) {
  ["usertest1"]=>
  int(88)
  ["usertest3"]=>
  int(1)
}
usertest1|i:1;usertest3|i:1;

评价

  • 优点: 实现简单, 无需修改php代码

  • 缺点: 配置不支持多样化, 只能应用于简单场景

2. 设置用户自定义会话存储函数

通过 session_set_save_handler() 函数设置用户自定义会话函数.

session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid [, callable $validate_sid [, callable $update_timestamp ]]] ) : bool    # >= php5.4 session_set_save_handler ( object $sessionhandler [, bool $register_shutdown = TRUE ] ) : bool

在配置完会话存储函数后, 再执行 session_start() 即可.

具体代码略, 以下提供一份 Memcached 的(来自Symfony框架代码):

<?php /*  * This file is part of the Symfony package.  *  * (c) Fabien Potencier <fabien@symfony.com>  *  * For the full copyright and license information, please view the LICENSE  * file that was distributed with this source code.  */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; /**  * MemcacheSessionHandler.  *  * @author Drak <drak@zikula.org>  */ class MemcacheSessionHandler implements \SessionHandlerInterface {   /**    * @var \Memcache Memcache driver.    */   private $memcache;   /**    * @var int Time to live in seconds    */   private $ttl;   /**    * @var string Key prefix for shared environments.    */   private $prefix;   /**    * Constructor.    *    * List of available options:    * * prefix: The prefix to use for the memcache keys in order to avoid collision    * * expiretime: The time to live in seconds    *    * @param \Memcache $memcache A \Memcache instance    * @param array   $options An associative array of Memcache options    *    * @throws \InvalidArgumentException When unsupported options are passed    */   public function __construct(\Memcache $memcache, array $options = array())   {     if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {       throw new \InvalidArgumentException(sprintf(         'The following options are not supported "%s"', implode(', ', $diff)       ));     }     $this->memcache = $memcache;     $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;     $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';   }   /**    * {@inheritdoc}    */   public function open($savePath, $sessionName)   {     return true;   }   /**    * {@inheritdoc}    */   public function close()   {     return $this->memcache->close();   }   /**    * {@inheritdoc}    */   public function read($sessionId)   {     return $this->memcache->get($this->prefix.$sessionId) ?: '';   }   /**    * {@inheritdoc}    */   public function write($sessionId, $data)   {     return $this->memcache->set($this->prefix.$sessionId, $data, 0, time() + $this->ttl);   }   /**    * {@inheritdoc}    */   public function destroy($sessionId)   {     return $this->memcache->delete($this->prefix.$sessionId);   }   /**    * {@inheritdoc}    */   public function gc($maxlifetime)   {     // not required here because memcache will auto expire the records anyhow.     return true;   }   /**    * Return a Memcache instance    *    * @return \Memcache    */   protected function getMemcache()   {     return $this->memcache;   } }

关于如何在PHP中使用Redis共享Session就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI