【问题标题】:Is PHP's session_start() idempotent?PHP 的 session_start() 是幂等的吗?
【发布时间】:2012-02-11 13:10:05
【问题描述】:

上面说的。不出所料,我找不到明确的答案。

我只是想知道在脚本中多次调用它是否会导致问题。

【问题讨论】:

  • +1 教我一个新词。 en.wikipedia.org/wiki/Idempotence
  • -1 使用错误的网站来教别人新词。并且在提出问题/也没有阅读文档页面之前甚至没有运行一个简单的测试。

标签: php session


【解决方案1】:

引用the manual

从 PHP 4.3.3 开始,在会话结束后调用 session_start() 之前启动会导致级别为E_NOTICE 的错误。
另外,第二个会话开始将被忽略。

所以,它不会做太多——除了发出一个通知,这表明存在某种问题;这意味着您不应多次调用此函数。


在@hakre 发表评论后进行编辑: 可以肯定的是,我已经使用以下代码部分进行了测试,在确保报告了错误和通知之后,它调用了 session_start() 两次:

<?php
ini_set('display_errors', 'on');
error_reporting(E_ALL | E_STRICT);

session_start();
session_start();

我确实收到了以下通知:

Notice: A session had already been started - ignoring session_start() in /.../temp.php on line 6

【讨论】:

  • 该手册关于该行为 AFAIK 并不完全正确。一些错误报告应该可用。
  • @hakre:那是什么意思?我刚刚测试了两次调用session_start(),我确实收到了我所期待的通知。 (在 PHP 5.3.6 上测试)
  • 这在 PHP 版本以及返回值之间有所不同。
  • 手册解释说这个通知是从 PHP 4.3.3 开始提出的(实际上,没有人应该再使用 PHP 4) ;并且会话启动失败时的返回值已随 PHP 5.3.0 更改;您是否注意到 PHP 版本之间的任何其他差异(如果是,报告它们可能很有用,以确保手册已更新)
【解决方案2】:

不,session_start 不是幂等的,它在语言的运行时状态中有依赖关系。

您通常可以多次调用它,这可能会给您一些警告或错误而没有太大区别,但是,如果您在调用之间更改会话状态和/或配置,则该函数的行为将不同。

由于调用函数会改变会话状态,从非常严格的幂等观点来看,它完全不是。

此外,需要注意的是,与$_SESSION 对应的该函数的结果仍然由关联的存储、会话名称和会话 ID 定义。

【讨论】:

    【解决方案3】:

    这会导致错误(会话已经开始)。

    但是如果你忽略这个错误,它就会是幂等的。

    在 PHP 5.4 中,我们将获得: http://nl3.php.net/manual/en/function.session-status.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2015-05-25
      • 2012-02-13
      相关资源
      最近更新 更多