应使用 $_SERVER['REQUEST_TIME_FLOAT'] 获取请求时间,这是 PHP 内置的微秒级精确时间戳,比 time() 和 $_SERVER['REQUEST_TIME'] 更可靠,控制器中可直接读取,无需依赖 Request 对象。

ThinkPHP 6 的 Request 对象不提供直接获取“请求时间”的方法
它本身没有 getRequestTime() 或类似接口。所谓“请求时间”,实际是 PHP 接收请求的系统时间,和框架无关——Request 只负责封装请求数据,不记录或生成时间戳。
应该用 $_SERVER['REQUEST_TIME_FLOAT'] 获取精确请求开始时间
这是 PHP 内置的、最准确的方式,返回浮点数(微秒级精度),比 time() 更可靠,尤其在长流程中避免因执行耗时导致偏差:
-
$_SERVER['REQUEST_TIME_FLOAT']:Apache/Nginx + PHP-FPM 下始终可用,推荐首选 -
$_SERVER['REQUEST_TIME']:整数秒级,精度低,已过时 -
microtime(true):可在任意位置调用,但越晚调用,值越偏离真实“请求开始”时刻
在 ThinkPHP 6 控制器里怎么安全使用
不要试图从 $this->request 提取时间;直接读 $_SERVER 即可。注意:该值在 CLI 模式下不可靠,但 HTTP 请求下稳定:
// 在控制器方法中
public function index()
{
$requestTime = $_SERVER['REQUEST_TIME_FLOAT'] ?? time();
// 后续可用于日志打点、耗时计算、幂等 token 生成等
return json(['request_time' => $requestTime]);
}
如果项目需统一管理,可封装为基类属性或服务,但没必要强耦合到 Request 实例上。
立即学习“PHP免费学习笔记(深入)”;
别混淆“请求时间”和“客户端发送时间”
HTTP 协议本身不强制携带客户端时间。某些前端可能加 X-Request-Time 头,但这完全不可信,也不默认存在:
-
$this->request->header('X-Request-Time'):需前端主动设置,且无校验,不能作为服务端可信时间源 - 若业务真需要客户端时间(如时区对齐),应由前端传
timestamp参数并配合签名验证,而非依赖 header
真正要记录的是服务器接收到请求那一刻,就用 $_SERVER['REQUEST_TIME_FLOAT'] —— 简单、标准、无歧义。



















