【发布时间】:2009-03-25 05:30:54
【问题描述】:
场景:
xyz.com 的所有页面都使用会话来检查我是否已登录并显示自定义内容。我在 iMac 上使用 Firefox 登录 xyz.com。现在,当我尝试同时访问xyz.com/page1.php和xyz.com/page2.php,直到page1加载page2才被处理。
代码示例
xyz.com/contains(链接):
/* session check code here */
@987654321@
@987654322@
xyz.com/page1.php 包含:
/* session check code here */
echo "Hello";
flush();
sleep(5);
echo "done";
xyz.com/page2.php 包含:
/* session check code here */
echo "Second Page";
/* {insert code} to log time() to log.txt */
测试
这就是我所做的。我登录到 shell 并保持这个命令运行:
user@xyz.com [~/public_html]# tail -f log.txt
从我的浏览器 (Firefox)(在 xyz.com 上),我在选项卡中打开了 page1 和 page2 的多个实例。如果你能看到,page1 至少需要 5 秒才能加载。现在,在第 1 页加载之前,对第 2 页的请求处于待处理状态。它根本没有处理。我怎么知道? page2 末尾的代码记录了对我正在监视的文件的访问时间。让我们考虑以下情况:
发出的请求(按顺序) 1.page1.php 2.page2.php 3.page2.php 4.page1.php 5.page1.php 6.page2.php
结果(大约)
1237961919 1237961920 1237961931
预期结果(大约)
1237961915 1237961915 1237961915
^假设所有调用同时触发
观察
在处理呼叫时,我显然也无法访问 xyz.com(这是另一个请求)。但是,如果我在另一个浏览器(Safari)中打开它,它运行良好。那是因为这是另一个会话?
可能的原因
-
服务器有一些安全措施吗?
我更像是一名编码员,但如果有人可以指点,我可以检查服务器(VPS)以查看 apache/php 是否配置错误。
-
我没有正确处理会话?
这有关系吗?不应该将第二个请求作为不同的线程处理吗?
-
外星人正在控制我的 VPS。
好吧,开玩笑。我只是厌倦了追踪这个问题。如果有人知道这里可能出了什么问题,我将不胜感激。
【问题讨论】:
-
如果您同时使用 safari 访问 page1 和 page2 会发生同样的事情吗?只是为了检查它是否是你的浏览器问题。
-
是的,Safari 上也有。我也在其他电脑上试过。
-
您的服务器正在使用基于文件的会话。当一个请求挂起时,会话文件被锁定,服务器将排队任何以后尝试使用同一会话的请求。切换到数据库存储的会话,你会没事的。