PHP会话行为

时间:2011-09-09 10:13:08

标签: php session

我收到了一些调查问卷,其中有一些字段检查(用PHP + HTML编写)。所以我通过https发送数据。

它像这样工作

<form id="frm_order" method="post" action="https://site/service_for_businesses" autocomplete="off">
<input name="username" id="username" size="40" maxlength="500" type="text" value="">
<button name="Submit" id="Submit" value="Отправить" type="submit" onclick="return final_check();"></button>
</form>

用户单击“提交”按钮后,所有数据都将移至$ _SESSION ['params'],然后传递给正在检查此数据的HELPER类。如果一切正常,那么用户将被重定向到“SUCCESS PAGE”(这部分工作正常),但如果表单字段中的USER数据有任何错误,则$ _SESSION [..]将传递给VIEW-controller和页面刷新并在有错误的表单字段附近显示警告。 问题是存在这样一种奇怪的行为:

1)我写了一些数据,例如我写了一个用户名“Mi%^ XS”
2)按下提交
3)检查数据时出错,导致用户不允许使用特殊符号,因此存在重定向
4)我看到一个页面上有错误的用户名和下面的警告
5)我什么也没做,只是按了SUBMIT - &gt;重定向
6)我得到了没有警告的空地 7)我按下了SUBMIT - &gt;重定向
8)我得到了与第4步中相同的东西-my用户名警告

我无法理解为什么。

我的网站部署到2台带有平衡器的网络服务器(以避免DdoS)。 这就像在两个服务器上有两个具有相同ID的会话

3 个答案:

答案 0 :(得分:1)

apache中的会话通常存储在本地磁盘上。 (请参阅位置的php配置。)

如果将PHP会话保存路径设置为某个共享资源(例如通过NFS的网络磁盘);它实际上可能共享会话信息,因此允许您在两台服务器上拥有相同的会话。

至少,除非两个PHP + Apache实例实际上具有相同的会话存储;对于相同(甚至其他)的SID,它们会有不同的会话。

答案 1 :(得分:1)

默认情况下,php生成会话ID并将它们存储在php.ini中的session.save_path定义的目录中

另外,如果你向php发送一个不存在的会话cookie,php将创建相应的会话。

因此,如果您在服务器1上发出创建会话的请求,它将为该会话创建一个cookie。如果你然后切换到服务器2,它将识别会话cookie,如果会话已经存在,它将使用它(显然你的情况)。在这种情况下,对于具有不同数据的2台服务器,您具有相同的会话ID。

该问题的解决方案是将会话存储在2个服务器(例如数据库)通用的位置。请参阅:http://fr.php.net/manual/en/function.session-set-save-handler.php

答案 2 :(得分:1)

默认情况下,PHP将会话文件保存到/ tmp目录中。如果您在2个webservers目录中运行您的网站,则必须可以从这两个Web服务器目录中访问它们,否则每个Web服务器都将存储自己的会话文件。

您可以通过在php.ini上设置session.save_path来更改目录。详情请见http://www.php.net/manual/en/session.configuration.php

您还可以在数据库中存储会话。