php 实现session共享
实现 PHP Session 共享的方法
PHP Session 共享可以通过多种方式实现,以下是几种常见的方法:
使用数据库存储 Session
将 Session 数据存储在数据库中,适用于多台服务器共享 Session 的场景。
-
创建数据库表存储 Session 数据:
CREATE TABLE `sessions` ( `session_id` varchar(255) NOT NULL, `data` text NOT NULL, `expires` int(11) NOT NULL, PRIMARY KEY (`session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -
修改 PHP 配置,使用自定义 Session 处理器:
session_set_save_handler( function ($savePath, $sessionName) { // 初始化操作 return true; }, function () { // 关闭操作 return true; }, function ($sessionId) { // 读取操作 $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $pdo->prepare("SELECT data FROM sessions WHERE session_id = ? AND expires > ?"); $stmt->execute([$sessionId, time()]); return $stmt->fetchColumn() ?: ''; }, function ($sessionId, $data) { // 写入操作 $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $pdo->prepare("REPLACE INTO sessions (session_id, data, expires) VALUES (?, ?, ?)"); $expires = time() + ini_get('session.gc_maxlifetime'); return $stmt->execute([$sessionId, $data, $expires]); }, function ($sessionId) { // 销毁操作 $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $pdo->prepare("DELETE FROM sessions WHERE session_id = ?"); return $stmt->execute([$sessionId]); }, function ($maxlifetime) { // 垃圾回收操作 $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $pdo->prepare("DELETE FROM sessions WHERE expires < ?"); return $stmt->execute([time()]); } );
使用 Redis 存储 Session
Redis 是一种高性能的键值存储系统,适合 Session 共享。
-
安装 Redis 和 PHP Redis 扩展。
-
修改 PHP 配置:
session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379" -
或者通过代码设置:

ini_set('session.save_handler', 'redis'); ini_set('session.save_path', 'tcp://127.0.0.1:6379');
使用 Memcached 存储 Session
Memcached 是另一种常用的分布式内存对象缓存系统。
-
安装 Memcached 和 PHP Memcached 扩展。
-
修改 PHP 配置:
session.save_handler = memcached session.save_path = "127.0.0.1:11211" -
或者通过代码设置:
ini_set('session.save_handler', 'memcached'); ini_set('session.save_path', '127.0.0.1:11211');
使用 NFS 共享 Session 文件
如果服务器在同一个局域网内,可以通过 NFS 共享 Session 文件目录。

-
在其中一台服务器上设置 NFS 共享目录:
# 在 NFS 服务器上 mkdir /var/lib/php/session chmod 777 /var/lib/php/session echo "/var/lib/php/session *(rw,sync,no_subtree_check)" >> /etc/exports exportfs -a -
在其他服务器上挂载该目录:
mount -t nfs nfs_server_ip:/var/lib/php/session /var/lib/php/session -
修改 PHP 配置:
session.save_path = "/var/lib/php/session"
使用 Cookie 加密存储 Session
对于小型应用,可以将 Session 数据加密后存储在客户端 Cookie 中。
- 加密和解密函数示例:
function encrypt($data, $key) { $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); $encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv); return base64_encode($encrypted . '::' . $iv); }
function decrypt($data, $key) { list($encrypted, $iv) = explode('::', base64_decode($data), 2); return openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv); }
2. 使用 Cookie 存储 Session:
```php
$key = 'your-secret-key';
if (isset($_COOKIE['session_data'])) {
$sessionData = decrypt($_COOKIE['session_data'], $key);
$_SESSION = json_decode($sessionData, true);
} else {
$encryptedData = encrypt(json_encode($_SESSION), $key);
setcookie('session_data', $encryptedData, time() + 3600, '/');
}
注意事项
- 数据库存储方式需要考虑性能问题,建议添加适当的索引。
- Redis 和 Memcached 需要确保服务的高可用性,避免单点故障。
- NFS 方式在网络延迟较高时可能影响性能。
- Cookie 存储方式需要注意安全性,确保加密密钥的保密性。
- 所有共享方案都需要考虑 Session 数据的清理机制。






