我有一个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,您的会话将按预期运行.
会话Cookie
请记住,HTTP是无状态的,因此会在您的服务器上跟踪会话,但客户端必须为每个请求标识自己.当你声明session_start()时,你的浏览器通常会设置一个cookie("PHP Session Id"),然后通过发送每个请求的cookie值来识别自己.使用具有会话值的请求调用脚本时,session_start()函数将尝试查找会话.为了向你自己证明这一点,请注意当你清除你的cookie时会话就会死掉.如果你的cookie是一个"会话"cookie(一个临时的cookie),即使你退出浏览器,很多人也会死掉.您提到您正在命名会话..查看您的浏览器cookie并查看您是否可以找到具有相同名称的cookie.
所有这一切都是说cookie在你的会话中扮演着积极的角色,所以如果客户端不支持cookie,那么就不能按照你现在的方式进行会话..至少不是那些替代客户.将在服务器上创建会话; 问题是客户是否参与.
如果cookie不是您的客户的选项,您将不得不找到另一种方法将会话ID传递给服务器.例如,这可以在查询字符串中完成,尽管以这种方式发送会话ID是一种被认为不那么私密的.
mysite.com?PHPSESSID=10alksdjfq9e
具体如何根据您的PHP版本而有所不同,但它基本上只是一种配置.如果设置了正确的运行时选项,PHP将透明地将会话ID作为查询参数添加到页面上的链接(当然,仅限相同的源).您可以在PHP网站上找到设置的详细信息.
旁注:多年前,这是尝试实施会话时的常见问题.由于存在安全问题,Cookie更新,许多人在浏览器中关闭了cookie支持.
旁注: @Uberfuzzy提出了一个很好的观点 -使用curl或wget的会话实际上是可行的.问题是它不太自动化.用户可能会将标头值转储到文件中,并在将来的请求中使用这些值.curl有一些"cookie awareness"标志,允许你更轻松地处理它,但你仍然必须明确地做到这一点.再说一次,你可以利用这个优势.如果您的替代客户端上有curl,那么您可以使用cookie感知标记自己合理地拨打电话.请参阅卷曲手册.