/ session

session

一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的 session id. 这个 id 可以存储在用户端的一个 cookie 中,也可以通过 URL 进行传递.

默认情况下,会类似这样一个文件:/var/lib/php/session/sess_i4g59l9mbfenr78jf34do42b36

PHP 默认的 session 处理程序会拖慢大型应用,因为这个处理程序把 session 数据储存在硬盘找那个,需要创建不必要的文件 I/O,浪费时间。我们应该把 session 数据保存在内存中,例如可以使用 Memcached(http://memcached.org )或 Redis(https://redis.io )。

这么做还有一个好处,以后便于伸缩。如果 session 数据存储在硬盘中,不便于增加额外的服务器。如果把 session 数据存储在 Memcached 或 Redis 中央数据存储区里,任何一台分布式 PHP-FPM 服务器都能访问会话数据。

若想在 PHP 中访问 Memcached 存储的数据,要安装连接 Memcached 的 PECL 扩展。然后再把下面两行添加到 php.ini 文件中,把 PHP 默认的 session 存储方式改为 Memcached:

session.save_handler = memcached # 原值为 files
session.save_path = "127.0.0.2:11211"

更变 session.name

/etc/php.ini 中的默认配置:

; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = PHPSESSID

cookie 部分可查看:cookie

Warning 会话名称至少需要一个字母,不能全部都使用数字,否则,每次都会生成一个新的会话 ID。

修改全局 session.name

修改 /etc/php.ini

; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = WebsiteID

自定义应用 session.name

可以在代码中设置当前应用的 session name:

session_name("WebsiteID");

例如 Yii2 中:

'components' => [
    'session' => [
        'name' => 'WebsiteID',
    ],
]

开发环境的 HTTP 传递 Session ID

在开发环境中一般我们都不会使用 https,所以,记得在服务器端把 Secure 设置为 false,否则每次请求都不会附带 SessionId 到服务器,服务器就会为每个请求都重新生成一个 SessionID。

'components' => [
    'session' => [
        'cookieParams' => [
            'secure' => false,
        ]
    ],
]