引子
一家咖啡店使用什么东西知道每一个客人点了什么东西呢?
-
桌子的号码
-
柜台本子
桌子的号码就是session的id
柜台的本子是客人不可以看到,也不可以随便更改的,这就服务器里保存的session文件
PHP里的Session
在php.ini里
session.save_handler = files
session.save_path = "c:\MyProgram\php\session"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session的特点
同一session只允许同时一个请求打开,一个请求需要在前面的请求都完成了才会进行。
如何避开这个问题,让系统可以同时进行好几个请求呢?
session文件的删除机制
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session三种存储方式应用:
<?php
function sessionByMem() {
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', '127.0.0.1:11211');
session_start();
if (!isset($_SESSION['mem_time'])) {
$_SESSION['mem_time'] = time();
}
echo '<pre>';
echo $_SESSION['mem_time'] . '<br />';
$memcached = new Memcache();
var_dump($memcached->addServer('127.0.0.1', 11211));
var_dump($memcached->get(session_id()));
}
function sessionByRedis() {
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379');
session_start();
if (!isset($_SESSION['redis_time'])) {
$_SESSION['redis_time'] = time();
}
echo '<pre>';
echo $_SESSION['redis_time'] . '<br />';
$redis = new Redis();
var_dump($redis->connect('127.0.0.1', 6379));
var_dump($redis->get('PHPREDIS_SESSION:' . session_id()));
}
function sessionByFile() {
ini_set('session.save_handler', 'file');
session_start();
if (!isset($_SESSION['file_time'])) {
$_SESSION['file_time'] = time();
}
echo '<pre>';
echo $_SESSION['file_time'] . '<br />';
# /var/lib/php5
}
//sessionByMem();
//sessionByRedis();
sessionByFile();
session理解:
-
session_start():开启session读取,一开启,$_SESSIION变量则被赋值,占用内存,直到程序运行结束才销毁
-
session_register_shutdown():将自定义函数注册为关闭会话的函数。
-
session_write_close():结束当前session并写入数据
-
session_set_save_handler():重写session使用方法
-
session_id:获取/设置当前会话 ID
-
session_create_id:创建新的会话 ID
-
session_regenerate_id:使用新生成的会话 ID 更新现有会话 ID
-
PHP中session默认使用文件系统进行存储的,当进行读写session文件操作时,存储session的文件处于锁定状态,此时其他需要读写session数据的请求需要等待前一个请求完成后才会进行,从而导致PHP阻塞的发生
-
redis可以解决拥塞的问题,memcache并不能解决拥塞的问题,具体问题不清楚
-
session开启后,会读取session数据并在程序结束的时候,重新写入session里
测试程序:
<?php
class MySessionHandler implements SessionHandlerInterface
{
function open($savePath, $sessionName) { }
function close() { }
function read($id) { }
function write($id, $data) { echo 1;exit; }
function destroy($id) { }
function gc($maxlifetime) { }
}
$handler = new MySessionHandler();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
session_start();
$_SESSION['test'] = 2;
echo date('Y-m-d H:i:s') . ':' . $_SESSION['test'];
利用session保存数据,cookie保存sessID来读取session数据
<?php
session_start();
session_name("GB_SID");
if ($_COOKIE[session_name()]) {
session_id($_COOKIE[session_name()]);
} else {
setcookie(session_name(), session_id(), time() + 86400 * 7, "/");
$_SESSION['test11'] = '11';
}