用啥? time() 函数还是 $_SERVER['REQUEST_TIME'] ?哪个更好?
Posted
技术标签:
【中文标题】用啥? time() 函数还是 $_SERVER[\'REQUEST_TIME\'] ?哪个更好?【英文标题】:What to use ? time() function or $_SERVER['REQUEST_TIME'] ? Which is better?用什么? time() 函数还是 $_SERVER['REQUEST_TIME'] ?哪个更好? 【发布时间】:2012-08-19 22:00:17 【问题描述】:这两个时间函数中哪一个更好?
我的网站上有一个表单,每微秒或更短时间就有数千个用户提交,因此我的服务器上同时有数千个请求。
所以我想使用在执行时不使用任何睡眠的那个。另外,$_SERVER['REQUEST_TIME']
和 time()
的独特性如何?两者都每微秒变化一次吗?
$_SERVER['REQUEST_TIME'] 会在我每次提交表单时更改吗?就像,time() 函数会在每个时间差时发生变化。
我需要向用户提供一个唯一的 url 以进行验证,在其中附加从两者中的任何一个生成的唯一结果?另外,使用 microtime() 会使 php 休眠吗?不是吗?
【问题讨论】:
我一直在想,那些每秒“有”数千个请求的人总是试图在琐碎的功能上节省开支,而不是在猜测/分析上浪费时间。 你为什么要用时间来验证?用于验证的唯一标识符不应该尽可能不可预测吗?时间可以(在限制内,但仍然)预测!简单地使用随机值不是更好吗? (可能将时间作为随机生成器的种子,但这是一个侧面) time() 和 $_SERVER['REQUEST_TIME'] 都是从 1970/01/01 开始的秒数。 microtime() 使用微秒。 【参考方案1】:视情况而定。
$_SERVER['REQUEST_TIME']
对应于请求开始的时间,Web 服务器提供此数据。
time()
实际上运行了一个系统调用,以检查调用此行的时间。
您需要更具体地说明您想要做什么,以便我们为您提供完整的答案。
【讨论】:
你不能依赖时间。也许生成一个随机令牌并用请求的 tim 和 ip 对其进行加盐,这应该可以解决问题。 每次提交表单时是否更改 $_SERVER[R_T] ? 它不能保证是唯一的,如果网络服务器是线程化的并且同时接收两个连接,那么这些值很可能是相同的。【参考方案2】:time()
每秒更改一次。 microtime()
(可选,(true)
)更频繁。
$_SERVER['REQUEST_TIME']
在 PHP 进程启动时设置,但它只是一个简单的变量查找,因此速度更快。大多数情况下,您不需要微秒级的分辨率,特别是如果该过程无论如何只运行几分之一秒来生成网页。
【讨论】:
我需要为用户提供一个唯一的 url 以进行验证,在其中附加从两者中的任何一个生成的唯一结果?另外,先生,microtime() 会让 PHP 休眠吗?不是吗? Microtime 不休眠。如果您需要一个唯一值,请使用专为此设计的东西 - 例如 php.net/manual/en/function.uniqid.php 或其他一些 UUID 生成器。 但我猜它使用了 gettimeofday() 让 PHP 进入睡眠状态? gettimeofday() 需要时间和精力,但它不会刻意等待。【参考方案3】:来自 php.net:
$_SERVER['REQUEST_TIME_FLOAT']; 请求开始的时间戳,精度为微秒。
http://php.net/manual/en/reserved.variables.server.php (不过要小心,请参阅 Alister 关于使用 REQUEST_TIME 的说明)
【讨论】:
【参考方案4】:$_SERVER['REQUEST_TIME']
是会话开始的时间,它与使用 time()
或 microtime()
完全不同,因为它在运行中是恒定的。
【讨论】:
【参考方案5】:您应该考虑基于microtime() 的毫秒数
$milliseconds = round(microtime(true) * 1000);
【讨论】:
【参考方案6】:您应该使用 time() 或 microtime() 或 uniqid() 如果这需要是唯一的用于验证目的。
问题是,为什么你需要时间来变得独一无二?
编辑:因为你编辑了你的问题。
$_SERVER['REQUEST_TIME'] 将为您提供请求开始的时间戳。它会根据用户发出请求的时间而变化。
【讨论】:
我需要为用户提供一个唯一的 url 以进行验证,在其中附加从两者中的任何一个生成的唯一结果?另外,先生,microtime() 会让 PHP 休眠吗?不是吗? 如果您正在寻找一个唯一的字符串进行验证,您可能应该查看函数 uniquid()。它“根据当前时间(以微秒为单位)获取一个带前缀的唯一标识符”。 uniqid() 使用 gettimeofday() 使 PHP 休眠?所以我要避免它,先生。 :) 每次提交表单时 $_SERVER[R_T] 是否会发生变化? 您是否进行了足够多的分析以确定 sleep() 存在任何显着的性能问题?以上是关于用啥? time() 函数还是 $_SERVER['REQUEST_TIME'] ?哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章
windows server 2003用啥无线网卡驱动?还是只能用有线的网卡驱动吗