如何保证session的一致性session.save
发布网友
发布时间:2022-04-07 05:24
我来回答
共4个回答
热心网友
时间:2022-04-07 06:53
php的在页面载入时或调用session_start()时从数据源中读取session数据到$_SESSION变量。
当页面执行完毕或调用session_write_close()时把$_SESSION变量写入数据源。
php默认的session.save_handler=files,可以通过文件锁来实现读写同步,保证session数据的一致性,不会产生问题。然而当使用sqlite作为session handler时,由于没有同步机制,会产生bug。如下代码:
test1.php
PHP code?
session_start();
$_SESSION['data1'] = 'data1';
sleep(10);
session_write_close();
test2.php
PHP code?
session_start();
$_SESSION['data2'] = 'data2';
session_write_close();
在同一浏览器进程里(保证使用相同的session_id),先访问test1.php,再访问test2.php,会发现data2根本没有写入sqlite数据库中。session.save_handler=memcache还没有测试,估计也有这个问题。如果采用默认的files handler会发现test2.php的请求会被挂起直至test1.php执行完毕,这就是文件锁同步机制造成的。
我想到了两种解决方案:
1、实现互斥锁,保证同一session_id访问session数据是同步的,这样会产生一个阻塞的问题(php默认的session实现也会有这个问题)。
2、写入session数据时进行数据合并,不过这样仍然不能完全保证数据一致性。
热心网友
时间:2022-04-07 09:46
开启事务,在事务内进行处理。
热心网友
时间:2022-04-07 11:37
不知道 怎么回答
热心网友
时间:2022-04-07 13:45
不知道是什么啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊