如何做网站手机/成都网络推广运营公司
前言
小型web服务, session数据基本是保存在本地(更多是本地磁盘文件), 但是当部署多台服务, 且需要共享session, 确保每个服务都能共享到同一份session数据.
redis 数据存储在内存中, 性能好, 配合持久化可确保数据完整.
设计方案
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 SymfonyComponentHttpFoundationSessionStorageHandler;/*** 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;}
}
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要请戳这里链接 或 者关注咱们下面的知乎专栏PHP架构师圈子zhuanlan.zhihu.com
