【问题标题】:A confusion about time() function in PHP关于 PHP 中 time() 函数的混淆
【发布时间】:2021-10-02 14:12:32
【问题描述】:

我不明白为什么从包含上一次时间的$_session['now']的变量中减去当前时间的结果为零。


我希望输出当前时间与创建变量$student->now 的时间之间的差异。请解释一下。

class Student
{

    public function __set($key, $value)
    {
        $_SESSION[$key] = $value ;
    }


    public function __get($key)
    {
        return $_SESSION[$key];

    }

}
session_start();

$student = new Student() ;

//__set function will be called ;
$student->now = time();


//__get function will be called ;
echo time() - $_SESSION["now"]; // output is zero ?!

【问题讨论】:

  • 您尝试过什么来解决问题?你被困在哪里了?如果两个调用直接成功,为什么应该有什么区别?
  • PHP 移动得如此之快,它可能包含相同的时间。在您的回声线之前尝试echo time()." - {$_SESSION["now"]} = ";
  • 主要问题是,当我尝试每 60 秒重新生成一次会话 ID 但我发现时间仍然为零时,如下例所示:``` if (!isset($_SESSION['CREATED '])) { $_SESSION['CREATED'] = time(); } else if (time() - $_SESSION['CREATED'] > 60) { // 会话在 60 秒前开始 session_regenerate_id(true); // 更改当前会话的会话 ID 并使旧会话 ID 无效 $_SESSION['CREATED'] = time(); // 更新创建时间 } ```

标签: php time session-cookies


【解决方案1】:

time() 的精度为 ONE 秒,你基本上是在做:


$now = time(); // e.g. 1627385278

echo time() - $now; // 1627385278 - 1627385278

这发生得非常快,所以输出(几乎总是)为零。

您的示例代码涉及“会话”这一事实暗示您想要测量不同 HTTP 请求之间的时间。如果是这种情况,则需要一些逻辑来仅设置第一次存储的值,而不是此后。

【讨论】:

    【解决方案2】:

    $_session['now'] 变量设置在回显之前的行中。 在 echo 行中,当前时间与之前行中设置的时间进行比较。

    因为这两行都是紧接着执行的,所以都是在同一秒内执行的。会有毫秒的差异,但time()函数以秒为单位,参考:https://www.php.net/manual/en/function.time.php

    这就是为什么两个时间戳是相同的,并且在比较它们时它们之间没有区别。

    【讨论】:

      猜你喜欢
      • 2015-01-05
      • 2012-08-04
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多