Home  >  Q&A  >  body text

PHP的SESSION写入问题

是这样的,我现在打算用memcache来存储信息

这样实现的write()方法

class MemcacheHandler implements \SessionHandlerInterface
{
    ...

    public function write($session_id, $session_data)
    {
        $mc = self::getMc();
        file_put_contents('/tmp/sess_log', $session_id.'-'.$session_data.'-'.self::$config['expire'].PHP_EOL, FILE_APPEND);    # 测试用
        return $mc->set($session_id, $session_data, self::$config['expire']);
    }

    ...
}

然后

phpsession_set_save_handler(new MemcacheHandler(), true);    #自己定义session处理

session_start();    # 开启session

$_SESSION['uid'] = 123456;    #写入数据

然后问题来了,分析/tmp/sess_log文件看出,将session数据写入memcache时,只写入了一次,当刷新页面的时候,并没有再次写入。这样的话,假设我用session来判断用户是否是登陆状态,那岂不是超过定义的时间之后,就自动掉线了?

如果我改成$_SESSION['uid'] = 78965;,这时却会再次写入。

google了下,没有找到答案,求各位大神解答一下,多谢了

天蓬老师天蓬老师2738 days ago665

reply all(9)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 15:33:01

    不用自己实现memcache session handler. 你装上php memcache扩展,在php.ini里配置下就能使用memcache 存session。

    reply
    0
  • PHPz

    PHPz2017-04-10 15:33:01

    session存储在memcache不是配置一下的事情么?怎么变得这么麻烦了。
    php使用 memcache 来存储 session

    reply
    0
  • 阿神

    阿神2017-04-10 15:33:01

    1:改时间戳试下

    http://php.net/manual/zh/memcache.set.php

    2:session不推介试用memcache存储 ,具体文章自己搜下 参见: memcache 作者 session 关键字

    reply
    0
  • PHPz

    PHPz2017-04-10 15:33:01

    并不是你赋值了就一定会触发写入,php应该在写入之前会判断写入被写入的值是否改变了,这也是很常见的降低写入负载的一种思路,你虽然在不停的赋值,但其实都是同一个值,所以实际session内容并没有改变

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:33:01

    你这是PHP5.4以上的写法,我的是PHP5.2的,把session写入memcache,我的是每次都写入,已经测试了,不知道是不是版本的问题,你在write方法里在写入前打印点东西看看执行了吗?

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:33:01

    memcache用LRU的,不推荐用它来存session

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 15:33:01

    ini_set('session.save_handler', 'memcached');
    或者你装了php memcache扩展
    ini_set('session.save_handler', 'memcache');
    ini_set('session.save_path', $memcachePath);

    $memcachePath 是一个字符串,可以拼接起多个memcached服务
    看一下手册,有说明。

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 15:33:01

    按照你现在的写法确实会这样,建议你在session的数据里面加个过期时间,自己续吧。

    ini_set('session.save_handler', 'memcached');使用这种方式有个问题,session的GC是系统控制的,你没办法在逻辑里面控制

    下面是续session时长的思路

    function write(){
    $md->set("xxx",array("uid"=>"xxxx","expire_time"=>自己逻辑的过期时间),memcache数据过期时间 );
    }

    function read(){
    $data = $md->get("xxxx");
    if($data){
    //sesion存在
    $diffTime = time() - $data["expire_time"];
    if($diffTime > 阀值){
    //续session的时间
    }
    }
    }

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:33:01

    楼主提到

    当刷新页面的时候,并没有再次写入

    当session没有过期的时候,session不会重新写。要看你的session配置的参数是怎么样的,是不是刷新也没不会导致过期呢,(很大可能是). 试试关掉并重新打开浏览器。

    用print_r(session_get_params()) 看看结果

    reply
    0
  • Cancelreply