2008-10-04 77 views
7

我有一个API依赖于请求之间的某些状态信息。作为代码的第一个简单版本,我只是简单地使用PHP会话来存储状态信息,而不是更先进的(APC,memcache,DB)。在我通过网络浏览器进行的最初测试中,一切都很完美。但是,似乎当客户端尝试通过诸如Curl或wget之类的非浏览器方法进行连接时,状态信息未被保留。在PHP中会创建一个会话,如果浏览器不使用

仅当浏览器正在请求页面时才会创建PHP会话吗?我明确地使用session_start()开始会话,并使用session_name()事先命名它。

附加说明。我了解到,我遇到的一个主要问题是我正在命名会话,而不是通过session_id($ id)设置会话ID;我使用session_name()的意图是检索先前创建的同一会话,并且正确的方法是将session_id设置为session_name。

看来,会话信息将保留在服务器上,如下所述(谢谢)。但为了保持这一点,您必须通过会话ID,或者,在我的情况下,任何其他唯一标识用户的ID。使用此id作为session_id,您的会话将按预期运行。

回答

20

会话Cookie

请记住,HTTP是无状态的,所以会话跟踪您的服务器上,但客户与每个请求对自身进行识别。当您声明session_start(),时,您的浏览器通常会设置一个cookie(“PHP会话Id”),然后通过发送每个请求的cookie值来标识自己。当使用具有会话值的请求调用脚本时,session_start()函数将尝试查找会话。为了向你自己证明这一点,请注意,当你清除Cookies时,会话就会消失。如果cookie是“会话”cookie(临时cookie),即使你退出浏览器,许多人也会死亡。您提到您正在命名会话。请查看您的浏览器Cookie并查看是否可以找到具有相同名称的Cookie。

所有这一切是说,饼干都打在你的会议中发挥积极作用,因此,如果客户端不支持cookie,那么你不能做一个会话你目前做的方式。至少不适合那些替代客户。会话将在服务器上创建;问题是客户是否参与。

如果Cookie不是您的客户的选项,您将不得不寻找另一种方式将会话ID传递给服务器。例如,这可以在查询字符串中完成,尽管以这种方式发送会话ID被认为不那么私密。

mysite.com?PHPSESSID=10alksdjfq9e 

如何做到这一点具体可能会与您的PHP版本有所不同,但它基本上只是一个配置。如果设置了正确的运行时选项,PHP会将会话标识作为查询参数透明地添加到页面上的链接上(当然,只有同源代码)。你可以在PHP website上找到详细的设置。

旁注:几年前,这是尝试实施会话时常见的问题。由于声称的安全问题,Cookie更新,许多人都在浏览器中关闭cookie支持。

旁注:@Uberfuzzy牌子好点 - 使用会话,卷曲或wget的实际上是可能的。问题在于它不那么自动。用户可能会将标题值转储到文件中,并在将来的请求中使用这些值。 curl有一些“cookie意识”标志,可以让你更轻松地处理,但你仍然必须明确地做到这一点。然后再次,你可以使用这个你的优势。如果您的替代客户端有卷曲,则可以使用cookie识别标志自己打电话。请参阅curl manual

+0

>但如果客户端不支持cookie(如卷曲或wget) 实际上。同时支持一些存储/加载cookie文件的方式 – Uberfuzzy 2008-10-04 09:29:16

2

如果您调用session_start(),那么如果客户端不在现有客户端中,将创建一个会话。如果客户端不支持(或被配置为忽略)用于维护会话的cookie或查询字符串机制,则将在每个请求上创建新的会话。

这可能会膨胀您的会话存储机制与未使用的会话。

如果您在会话中存储某些内容(例如,用户登录或其他机器人不太可能执行的操作)时只调用session_start()可能会更好一些,如果您觉得这可能会成为一个问题。

2

仅当浏览器正在请求页面时才会创建PHP会话吗?

简答:是的。会话是专门为利用浏览器功能解决HTTP无状态问题而创建的。 APC,memcached,DB等无所谓。这些只是会话的存储方法,并会遭受同样的问题。

较长的答案:创建会话的概念是为了说明HTTP是无状态协议,事实证明,状态对于各种软件应用程序非常重要。

实现会话的最常见方式是使用cookie。 PHP使用cookie发送会话ID,浏览器发回带有会话ID的cookie。此ID用于服务器上查找您存储在会话中的任何信息。 PHP有能力在URL末尾包含和读取会话ID,这假设用户将通过单击包含生成的会话ID的链接导航到您的站点/应用程序中的页面。

在您的具体情况下,可以使用curl(也可能是wget)的cookie。卷曲一个Web浏览器,只有一个没有GUI。如果是你使用的命令行卷曲程序(相对于C库,PHP扩展等),请阅读以下选项

-b/--cookie 
-c/--cookie-jar 
-j/--junk-session-cookies 
相关问题