CoffeeCat's IT Blog

PHP的Session阻塞问题探讨

    最近在开发一个项目,其中有1个PHP页面需要执行较长时间,而且我发现,在执行这个页面的时候,其他的页面都不能访问了,需要等这个页面执行完成以后,其他页面才能打开。

    猜想了一下,有以下几种可能
  1. Web Server(Apache 2.2)是不是只能同时处理1个客户端连接?
  2. 是不是打开MySQL数据库的时候被阻塞了?
  3. 是不是session_start导致了阻塞?

    于是,我写了几个页面测试了一下,发现是session导致了阻塞,而其他两种情况不会造成阻塞。

    查了下PHP的Bug列表,发现有人提出了这个问题:
Description:
------------
Calling session_start() appears to wait until other scripts have exited

that are using the same session. My guess is the 1st request locks the 
session file 
for exclusive use, and the second request blocks until it 
can open it.


    PHP官方的回复是:
Thank you for taking the time to write to us, but this is not a bug.This is expected, the session file is locked to avoid corruption.

    结合了PHP的Session机制,找到了阻塞的原因。由于PHP的Session信息是写入文件的,1个客户端占有1个session文件。因此,当session_start被调用的时候,该文件是被锁住的,而且是以读写模式锁住的(因为程序中可能要修改session的值),这样,第2次调用session_start的时候就被阻塞了。

    最简解决方法:

    查了PHP的手册,发现一个session_write_close函数,作用是Write session data and end session,也就是写session的数据,同时关闭这个session。因此,我们可以在用完session之后,调用这个函数关闭session文件即可接触锁定。一般,session是用来记录用户身份信息的,以便PHP进行身份认证,因此完全可以将session的读写放在页面刚开始执行的时候,在执行完以后,马上调用session_write_close函数即可。


Ferris Xu
2009年10月20日

posted on 2009-10-22 11:33 CoffeeCat 阅读(1355) 评论(3)  编辑 收藏 引用

评论

# re: PHP的Session阻塞问题探讨 2011-01-12 12:04 王兴华

谢谢你 帮了我大忙  回复  更多评论   

# re: PHP的Session阻塞问题探讨 2011-01-13 12:04 CoffeeCat

@王兴华
呵呵,荣幸~  回复  更多评论   

# re: PHP的Session阻塞问题探讨 2012-04-09 18:14 phper

多谢。  回复  更多评论   

只有注册用户登录后才能发表评论。
<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

常用链接

留言簿(203)

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜