繁体   English   中英

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

[英]In PHP will a session be created if a browser is not used

我有一个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感知标记自己合理地拨打电话。 请参阅卷曲手册

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

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

如果您觉得这可能是一个问题,那么当您在会话中存储某些内容(例如用户登录或机器人不太可能做的其他事情)时,最好只调用session_start()。

只有在浏览器请求页面时才会创建PHP会话吗?

简短回答 :是的。 会话专门用于通过利用浏览器功能来解决HTTP无状态问题。 APC,memcached,DB等无所谓。 这些只是会话的存储方法,并且会遇到同样的问题。

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

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

在您的特定情况下,可以使用curl(可能还有wget)的cookie。 Curl 一个Web浏览器,只有一个没有GUI。 如果它是你正在使用的命令行curl程序(而不是C库,PHP扩展等),请阅读以下选项

-b/--cookie
-c/--cookie-jar
-j/--junk-session-cookies

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM