微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在PHP中,如果未使用浏览器,则会创建会话

我有一个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 website上找到有关设置的详细信息.

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

旁注:@Uberfuzzy提出了一个很好的观点 – 使用curl或wget的会话实际上是可行的.问题是它不太自动化.用户可能会将标头值转储到文件中,并在将来的请求中使用这些值. curl有一些“cookie awareness”标志,允许你更轻松地处理它,但是你仍然必须明确地这样做.再说一遍,你可以利用这个优势.如果您的替代客户端上有curl,那么您可以使用cookie感知标志自己合理地拨打电话.参见curl manual.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐