PHP session
PHP 自带了 session 管理。这极大地提高了 session 管理的便捷性,不愧于最好的语言。内置了不少以 "session_" 开头的函数,在程序的任何地方都能够调用这些函数来处理与 session 相关的事情。
session_start(): Start new or resume existing session
session_id(): Get and/or set the current session id
session_destroy(): Destroys all data registered to a session
session_abort(): Discard session array changes and finish session
session_unset(): Free all session variables
session_reset(): Re-initialize session array with original values
session_register_shutdown(): Register `session_write_close()` as a shutdown function
session_write_close(): Write session data and end session
问题背景
在拥有多服务的网站后台中,有一个专门提供 session 管理的 SSO 服务。顾名思义,单点登录服务,就是对其他服务提供登录、鉴权、session 管理等功能的服务。
不同的服务可以使用不同的编程语言来编写,服务之间可以通过 rpc 或者 HTTP API 的方式来通信。在我遇到问题的场景下,SSO 是用 Go 来编写的,业务 A 是用 PHP 来编写的。
问题:在注销账号的时候,需要将所有服务里相关的 session 都注销掉。而在业务 A 中,怎样注销指定的 session 呢?
采用的解决方案
在所有的服务中,session id 是从 HTTP Cookie 中获取。使用的框架是 CodeIgniter,配置好 $config["cookie_name"]
即可。
经测试,如下方法可以:
class Session_controller extends API_controller {
function __construct() {
parent::__construct();
}
function action_post() {
// clear all session data
session_destroy();
// register `session_write_close` as a shutdown function
session_register_shutdown();
// shutdown the current session
session_write_close();
$this->response(0, self::HTTP_OK, "OK", null);
}
理论上而言,调用 session_abort()
就可以了。