我有一个API,它依赖于请求之间的某些状态信息。作为代码的简单第一版,我只是使用PHP会话来存储状态信息而不是更高级的东西(APC,memcache,DB)。在我最初的网络浏览器测试中,一切都运行良好。但是,当客户端尝试通过非浏览器方法(如Curl或wget)进行连接时,似乎不会保留状态信息。
如果浏览器请求页面,是否只会创建PHP会话?我明确地使用session_start()启动会话,并使用session_name()预先命名它。
附加说明。我了解到我遇到的一个主要问题是我在命名会话而不是通过session_id设置会话ID($ id);我使用session_name()的目的是检索先前创建的相同会话,正确的方法是将session_id设置为session_name。
似乎会话信息将保留在服务器上,如下所述(谢谢)。但要保持这一点,您必须传递会话ID,或者,就像我的情况一样,任何其他唯一标识用户的ID。使用此id作为session_id,您的会话将按预期运行。
答案 0 :(得分:20)
会话Cookie
请记住,HTTP是无状态,因此会在您的服务器上跟踪会话,但客户端必须在每个请求中标识自己。当您声明session_start()时,您的浏览器通常会设置一个cookie (“PHP会话ID”),然后通过发送每个请求的cookie值来识别自己。使用具有会话值的请求调用脚本时,session_start()函数将尝试查找会话。为了向你自己证明这一点,请注意当你清除你的cookie时会话就会死掉。如果你的cookie是一个“会话”cookie(一个临时的cookie),即使你退出浏览器,很多人也会死掉。你提到你正在命名会话..看看你的浏览器cookie,看看你是否能找到一个同名的cookie。
所有这一切都是说Cookie会在您的会话中发挥积极作用,因此如果客户端不支持Cookie ,那么您就无法按照自己的方式进行会话目前这样做..至少不是那些替代客户。将在服务器上创建会话;问题是客户是否参与。
如果您的客户无法使用Cookie,则必须找到另一种方式将会话ID传递给服务器。例如,可以在查询字符串中完成此操作,尽管以这种方式发送会话ID会被认为不那么私密。
mysite.com?PHPSESSID=10alksdjfq9e
具体如何根据您的PHP版本而有所不同,但它基本上只是一种配置。如果设置了正确的运行时选项,PHP将透明地将会话ID作为查询参数添加到页面上的链接(当然,仅限相同的源)。您可以在PHP website上找到有关设置的详细信息。
旁注:多年前,这是尝试实施会话时的常见问题。 Cookie更新,许多人因为出于安全考虑而关闭了浏览器中的cookie支持。
旁注: @Uberfuzzy 提出了一个很好的观点 - 使用curl或wget的会话实际上是可行的。问题是它不太自动化。用户可能会将标头值转储到文件中,并在将来的请求中使用这些值。 curl有一些“cookie awareness”标志,允许你更轻松地处理它,但你仍然必须明确地做到这一点。再说一次,你可以利用这个优势。如果您的替代客户端上有curl,那么您可以使用cookie感知标记自己合理地拨打电话。请参阅curl manual。
答案 1 :(得分:2)
如果您调用session_start(),那么如果客户端不在现有客户端中,则会创建会话。如果客户端不支持(或配置为忽略)用于维护会话的cookie或查询字符串机制,则将在每个请求上创建一个新会话。
这可能会使用未使用的会话使会话存储机制膨胀。
当你在会话中存储某些东西时(例如用户登录,或机器人不太可能做的其他事情),如果你觉得这很可能只是调用session_start()可能是个更好的主意。一个问题。
答案 2 :(得分:2)
只有在浏览器请求页面时才会创建PHP会话吗?
简短回答:是的。会话专门用于通过利用浏览器功能来解决HTTP无状态问题。 APC,memcached,DB等无所谓。这些只是会话的存储方法,并且会遇到同样的问题。
更长的答案:创建会话的概念是为了解释HTTP是无状态协议的事实,并且事实证明状态对于各种各样的软件应用程序非常重要。
实施会话的最常用方法是使用Cookie。 PHP在cookie中发送会话ID,浏览器发回带有会话ID的cookie。在服务器上使用此ID来查找您在会话中存储的任何信息。 PHP能够在URL末尾包含和读取会话ID,但这假定用户将通过单击包含生成的会话ID的链接导航到您的站点/应用程序上的页面。 / p>
在您的特定情况下,可以使用curl(可能还有wget)的cookie。 Curl 是一个Web浏览器,只有一个没有GUI。如果它是你正在使用的命令行curl程序(而不是C库,PHP扩展等),请阅读以下选项
-b/--cookie
-c/--cookie-jar
-j/--junk-session-cookies