BeWithYou

胡搞的技术博客

  1. 首页
  2. PHP
  3. swoole服务中session的处理

swoole服务中session的处理


swoole_server中对象有4层生命周期:1.程序全局期,2.进程全局期,3.会话期,4.请求期。

session的使用是在会话期,会话期的对象是常驻内存的,不需要session_start之类的操作。但是如果是这种情况,swoole的HTTP服务和普通的php-fpm放在一个环境里,使用相同的域名,利用nginx针对特定路径进行转发,就会存在session取不到的问题。

因为:

  1. swoole单独开启HTTP服务,session存储的方式和路径是由php.ini里的session.save_handler session.save_path等决定的。而普通的php-fpm服务,session存储的方式是由php-fpm.d/www.conf这样的配置文件里的配置项决定的。可能不在同一个目录下,需要手动修改一下。
  2. 改成同样的session存储路径以后,发现生成的sess_xxxx文件,是不同的用户和用户组的。php-fpm生成的是apache:apache用户,而swoole生成的是root:root,当然跟swoole进程的用户有关。而身为root居然不能使用apache用户组的sess文件,不知道为什么。改成同样的用户组就可以了。

解决方法:

手动解析session即可。直接读取sess文件,并且用session_decode方法解析到内存里。注意这里每次请求过来要重置$_SESSIONsession_destroy()并不管用。

function onRequest($request, $response) {
    $_SESSION = array();
    $sessionId = $request->cookie['PHPSESSID'];
    $fileName = session_save_path()."/sess_$sessionId";
    if(file_exists($fileName)){
        $content = file_get_contents($fileName);
        session_start();
        session_decode($content);
    }
    var_dump($_SESSION);
    $response->header(Content-Type', 'application/json');
    $response->end('xxxxx');
}
回到顶部