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

在PHP中,如果不使用浏览器,会创建会话吗,php,session,browser,Php,Session,Browser,我有一个API,它依赖于请求之间的某些状态信息。作为代码的第一个简单版本,我只是使用PHP会话来存储状态信息,而不是更高级的东西(APC、memcache、DB)。在我最初的网络浏览器测试中,一切都很完美。然而,当客户端试图通过非浏览器方法(如Curl或wget)进行连接时,状态信息似乎不会被保留 只有当浏览器请求页面时,才会创建PHP会话吗?我用session_start()显式启动会话,并用session_name()预先命名它 添加的注释。我了解到,我遇到的一个主要问题是,我命名会话,而不

我有一个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作为会话id,您的会话将按预期运行

会话Cookies

请记住,HTTP是无状态的,因此会在服务器上跟踪会话,但客户端必须在每个请求中标识自己。当您声明session_start()时,您的浏览器通常会设置一个cookie(“PHP会话Id”),然后通过在每个请求中发送cookie值来识别自身。当使用具有会话值的请求调用脚本时,session_start()函数将尝试查找会话。为了向自己证明这一点,请注意,当您清除cookie时,会话将终止。。如果cookie是一个“会话”cookie(临时cookie),那么即使您退出浏览器,很多cookie也会死掉。您提到您正在命名会话。。查看浏览器cookies,看看是否可以找到同名cookie

所有这一切都意味着Cookie在您的会话中扮演着积极的角色,因此如果客户端不支持Cookie,那么您就不能以当前的方式进行会话。。至少不适合那些替代客户。将在服务器上创建会话;问题是客户是否参与

如果您的客户端不能选择cookie,那么您必须找到另一种方法来将会话id传递给服务器。例如,这可以在查询字符串中完成,尽管以这种方式发送会话id的私密性稍低

mysite.com?PHPSESSID=10alksdjfq9e
具体如何操作可能因您的PHP版本而异,但它基本上只是一种配置。如果设置了正确的运行时选项,PHP将透明地将会话id作为查询参数添加到页面上的链接中(当然,只有相同的源代码)。您可以在上找到设置该选项的详细信息

旁注:多年前,在尝试实现会话时,这是一个常见问题。cookie是较新的,许多人因为声称的安全问题而关闭浏览器中的cookie支持

旁注:@Uberfuzzy提出了一个很好的观点-使用curl或wget会话实际上是可能的。问题是它的自动化程度较低。用户可能会将头值转储到文件中,并在将来的请求中使用这些值。curl有一些“cookieawareness”标志,可以让您更轻松地处理这个问题,但您仍然必须显式地这样做。再说一次,你可以利用这个优势。如果curl在您的备用客户机上可用,那么您可以使用cookie感知标志自己进行调用。请参阅。

如果调用session_start(),则如果客户端不在现有会话中,则将创建会话。如果客户端不支持(或配置为忽略)用于维护会话的cookies或querystring机制,则会在每次请求时创建一个新会话

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

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

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

简短回答:是。创建会话是为了通过利用浏览器功能来解决HTTP无状态问题。APC、memcached、DB等都不重要。这些只是会话的存储方法,并且会遇到同样的问题

更详细的回答:会话的概念是为了说明HTTP是一种无状态协议这一事实,事实证明,这种状态对于各种各样的软件应用程序都非常重要

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

在您的特定情况下,可以将cookies与curl(可能还有wget)一起使用。Curl是一个web浏览器,只是一个没有GUI的浏览器。如果您使用的是命令行curl程序(与C库、PHP扩展等相反),请阅读以下选项

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

>但是如果客户端不支持cookies(比如curl