PHP session锁

描述:

在PHP中,当同一个客户端执行两个包含session_start()的页面,如果先执行的脚步执行时间较长,就会导致session文件阻塞。具体表现为:一个PHP页面的执行时间比较长,而只要这个页面没有执行完毕,其他的页面访问都是长时间加载状态,只有那个页面执行完毕了,剩下的页面才能打开。

原因:

PHP 默认是用文件格式存储session,对于每一个请求执行包含有session_start()的页面后,就会默认创建一个包含session_id的文件名,且会对文件进行锁定,如果用户在这个客户端又访问了一个包含了session_start()的页面,由于session_id一样,这个页面也要读取该用户存放的session文件,如果第一个页面没有执行完成,这个文件就一直被锁定,第二个页面就无法获取,只能一直处于等待状态。

可能造成的后果:

如果网站有大量的用户访问,就好导致session读取文件一直堵塞等待,用户浏览器一直保持和服务器的连接,从而会消耗掉大量的服务器资源。而且,随着web服务器活跃连接数的增大,可能会耗费完连接资源,造成出现拒绝服务现象。

解决办法:

相比于使用数据库存储session,我比较推荐使用redis存储session。相比于文件和数据库,读写速度会有很大的提升,而且在可以做到多服务器共享。

时间: 2024-10-27 12:58:29

PHP session锁的相关文章

asp.net MVC Session锁的问题

一直在用Session,对Session锁并没有太多的关注,可能是平时没有注意.前段时间突然发现,一个Ajax Get请求,直接访问地址,只需要几十ms,但是在页面中加载,却需要2s.最后定位到Session的问题. 具体的内容我在园里看了下别人的文章:http://blog.csdn.net/paolei/article/details/38052129 不过,也发现了一些问题. 比如,这个例子: 后端: public class MyController : Controller { //

CI框架(3 or 4) session锁问题引发的讨论

角色介绍 sskaje:提起疑问者,疑似国人 narfbg:CI作者之一 sskaje:在CI3和CI4中,用来实现session的redis驱动与memcached驱动关于session key锁的设计是不对的. 估计是sskaje一针见血的表达导致了作者的第一次回复会带有不满情绪.. CI4中,代码老套,虽然更加兼容但是仍然有bugCI4中关于session锁的循环中的伪代码如下: if redis::ttl(lock_key) > 0 then sleep 1s continue loop

php的session锁

PHP 锁住执行中的session 今天做一个应用本来想在php处理程序期间把信息写入session 在后台执行 然后前台通过ajax进行调用查看 发现无论如何调用都要等 程序完全执行完 才会出现结果. 百度了下 原来 PHP 的session 设置了锁的功能. (类似MYSQL锁表) <?php session_start(); $_SESSION['test'] = 0; session_write_close(); // notice! sleep(5); echo "complet

PHP Session可能会引起并发问题

PHP Session可能会引起并发问题 在进行Web应用程序开发的时候,人们经常会用Session存储数据.但可能有人不知道,在PHP中,Session使用不当可能会引起并发问题. 如果同一个客户端并发发送多个请求,而每个请求都使用了Session,那么PHP Session锁的存在会导致服务器串行响应这些请求,而不是并行.这是因为在默认情况下,PHP使用文件存储Session数据.对于每一个新的 Session,PHP会创建一个文件,并持续向其中写入数据.所以,每次调用session_sta

php session 读写锁

php session 读写锁 先看一个样例,功能: 1.点击页面中一个button,ajax运行php,php中用session记录运行到哪一步. 2.使用ajax轮询还有一个php,获取session中数据,输出运行到哪一步. session.html 调用php运行,并输出运行到第几步 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4

oracle--事物特性、锁、

update emp set comm = 100 where empno = 7369; 使用dba用户查看事务 ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS START_TIME START_SCNB START_SCNW START_UEXT START_UBAFIL START_UBABLK START_UBASQN START_UBAREC SES_ADDR FLAG SPACE RECURSIVE NOUN

mysql基础和数据库的优化

Mysql基础... 4 Mysql介绍... 4 登录mysql mysql –u root –p[掌握]... 4 SQL语言... 4 DCL. 4 grant. 4 revoke. 4 DDL. 4 建库... 4 删库... 4 建表... 4 看表结构... 5 删表... 5 修改表... 5 DML[重点]... 5 增加... 5 删除... 5 修改... 5 查看... 5 排序... 5 总数... 5 求和... 5 平均... 6 最大... 6 最小... 6 表连

Ajax实现的长轮询不阻塞同一时间内页面的其他Ajax请求(同域请求)

最近要做一个来电的弹屏功能,利用OM 系统的接口,OM系统发送请求到接口程序,分析数据添加到mysql数据库中,然后把最新的数据id 跟今日来电的总的数量存储到memcache 中.弹屏程序根据读取的memcache 中的数据  比对,比较是不是有新的请求到来.中间遇到问题是:前台在轮询等待数据的时候,页面中的其他请求被阻塞,查了好多资料,包括 apache 的mpm 模式,都没有找到原因.后来 在论坛里边查到原因:如下 实际上是不能并发访问同一个站点使用了session的页面,因为访问A页面时

oracle日常监控语句

oracle常用的性能监控SQL语句 一.查询历史SQL: ---正在执行的SQL语句: select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT from v$session a, v$sqlarea b where a.sql_address = b.address; ---查询Oracle正在执行的sql语句及执行该语句的用户:SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, s