服务器每个会话只允许一个请求

时间:2009-03-25 05:30:55

标签: php session

示例:

xyz.com的所有页面都使用会话来检查我是否已登录并显示自定义内容。我在iMac上使用Firefox登录xyz.com。现在,当我尝试同时访问xyz.com/page1.php和xyz.com/page2.php时,直到page1加载page2未被处理。

代码示例

xyz.com/contains(链接):

/* session check code here */
Page1
Page2

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页加载之前,对page2的请求正在等待处理。它根本没有处理过。我怎么知道的?第2页末尾的代码记录了我正在监视的文件的访问时间。让我们考虑以下情况:

要求被解雇(按顺序) 1. page1.php 2. page2.php 3. page2.php 4. page1.php 5. page1.php 6. page2.php

结果(约)

1237961919< - #2
1237961920< - #3
1237961931< - #6

预期的内容(约)

1237961915< - #2
1237961915< - #3
1237961915< - #6

^假设所有呼叫同时被触发

观察

在处理呼叫时,我显然无法访问xyz.com(是另一个请求)。但是,如果我在另一个浏览器(Safari)中打开它,它运行良好。那是因为这是另一场会议?

可能的原因

  1. 服务器有一些安全措施吗?

      

    我更喜欢编码器,但如果有人可以指点,我可以查看服务器(VPS)以查看apache / php是否配置错误。

  2. 我没有正确处理会话?

      

    重要吗?不应该将第二个请求作为不同的线程处理吗?

  3. 外星人正在控制我的VPS。

      

    好的,开个玩笑。我只是厌倦了追踪这个问题。如果有人知道这里可能出现什么问题,我真的很感激。

5 个答案:

答案 0 :(得分:4)

在完成会话检查代码后,尝试在page1.php中调用session_write_close()

/* session check code here */
session_write_close();
echo "Hello";
flush();

这应关闭会话文件(删除锁定),page2.php可以打开它。

http://php.net/manual/en/function.session-write-close.php

答案 1 :(得分:3)

您的服务器正在使用基于文件的会话。当一个请求挂起时,会话文件被锁定,服务器将对尝试使用同一会话的任何后续请求进行排队。

切换到数据库存储的会话,你会没事的。

答案 2 :(得分:1)

答案 3 :(得分:0)

从未遇到过类似的事情。你确定你没有使用CGI而不是FastCGI吗?还要检查你的网络服务器产生多少个php进程以及它们可以处理多少个请求。

为了帮助您进行测试,您可能希望将sleep function放在测试页中。

答案 4 :(得分:0)

不知道php,但是使用asp.net,会话对象一次不能被多个线程用于读/写。所以它产生了你所描述的东西。第二个请求等待会话状态“解锁”以开始处理。它确实有意义,因为会话对象对于请求的所有处理都是一致的。