代码之家  ›  专栏  ›  技术社区  ›  jW.

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

  •  7
  • jW.  · 技术社区  · 17 年前

    我有一个API,它依赖于请求之间的某些状态信息。作为代码的第一个简单版本,我只是使用PHP会话来存储状态信息,而不是更高级的信息(apc、memcache、db)。在我最初在网络浏览器中进行的测试中,一切都运行得很好。但是,当客户端试图通过非浏览器方法(如curl或wget)连接时,状态信息似乎没有被保留。

    只有在浏览器请求页面时才会创建PHP会话吗?我正在用session_start()显式启动会话,并在用session_name()进行命名之前对其进行命名。

    附加说明 .我了解到我遇到的一个主要问题是,我命名会话而不是通过会话标识($id)设置会话标识;我使用会话标识()的目的是检索以前创建的会话,正确的方法是设置会话标识而不是会话名称。

    会话信息似乎将保留在服务器上,如下所述(谢谢)。但要保持这一点,您必须传递会话ID,或者像我这样传递唯一标识用户的任何其他ID。使用此ID作为会话ID,您的会话将按预期工作。

    3 回复  |  直到 17 年前
        1
  •  20
  •   community wiki 9 revs keparo    17 年前

    会话cookie

    记住http是 无国籍的 ,因此在服务器上跟踪会话,但是 客户机 必须在每个请求中标识自己。当您声明session_start()时, 您的浏览器通常正在设置cookie (php会话ID),然后通过发送每个请求的cookie值来标识自己。当使用具有会话值的请求调用脚本时,session_start()函数将尝试查找会话。要向自己证明这一点,请注意,清除cookie后会话将停止。如果cookie是一个“会话”cookie(临时cookie),那么即使您退出浏览器,也会有很多人死亡。您提到要命名会话。看看你的浏览器cookie,看看你能不能找到一个同名的cookie。

    所有这些都意味着cookies在您的会话中扮演着积极的角色,因此如果 客户端不支持cookie ,那么您就不能像当前那样进行会话。至少对其他客户来说不是这样。将在服务器上创建会话;问题是客户端是否参与。

    如果你的客户不能选择饼干,你必须找到 另一种方式 向服务器传递会话ID。这可以在 查询字符串 例如,尽管以这种方式发送会话ID被认为不那么私有。

    mysite.com?PHPSESSID=10alksdjfq9e
    

    具体的方法可能会因您的PHP版本而异,但它基本上只是一种配置。如果设置了正确的运行时选项,PHP将透明地将会话ID作为查询参数添加到页面上的链接中(当然,仅限同一个源)。您可以在 PHP website .

    司扥噢特: 几年前,在试图实现会话时,这是一个常见的问题。cookie比较新,很多人因为担心安全问题而关闭浏览器中的cookie支持。

    司扥噢特: @ Uberfuzzy 有一个很好的观点-使用curl或wget会话实际上是可能的。问题是它的自动化程度较低。用户可以将头值转储到文件中,并在将来的请求中使用这些值。curl有一些“cookie意识”标志,可以让您更容易地处理这个问题,但您仍然必须明确地做到这一点。同样,你也可以利用这个优势。如果您的备选客户机上有curl,那么您可以使用cookie意识标志自己进行调用。参考 curl manual .

        2
  •  2
  •   MarkR    17 年前

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

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

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

        3
  •  2
  •   Alana Storm    17 年前

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

    简短回答 是的。会话是专门为利用浏览器功能解决HTTP无状态问题而创建的。APC、memcached、db等不重要。这些只是会话的存储方法,并且会遇到相同的问题。

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

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

    在您的特定情况下,可以使用曲奇(可能还有wget)。卷曲 一个网络浏览器,只有一个没有图形用户界面。如果您使用的是命令行curl程序(而不是C库、PHP扩展等),请阅读以下选项

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