【问题标题】:Server allowing only one request per session服务器每个会话只允许一个请求
【发布时间】: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)中打开它,它运行良好。那是因为这是另一个会话?

可能的原因

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

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

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

    这有关系吗?不应该将第二个请求作为不同的线程处理吗?

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

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

【问题讨论】:

  • 如果您同时使用 safari 访问 page1 和 page2 会发生同样的事情吗?只是为了检查它是否是你的浏览器问题。
  • 是的,Safari 上也有。我也在其他电脑上试过。
  • 您的服务器正在使用基于文件的会话。当一个请求挂起时,会话文件被锁定,服务器将排队任何以后尝试使用同一会话的请求。切换到数据库存储的会话,你会没事的。

标签: php session


【解决方案1】:

完成会话检查代码后,尝试在 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

【讨论】:

  • 只是强调一下:这对于 flush() 或将一些输出发送回浏览器以使其正常工作很重要
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    【讨论】:

    • 谢谢,但这不是 FF 问题。
    【解决方案4】:

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

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

    【讨论】:

    • 所有这些请求都是在服务器上生成的,也就是说,当我运行top时,它们会显示为进程。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2014-10-11
      • 2015-03-12
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多