草庐IT

php time() 和 microtime() 有时不一致

coder 2024-01-05 原文

在使用 microtime()(使用 PHP 5)记录一些数据时,我遇到了一些值,这些值似乎与我的日志文件的时间戳略有不同,所以我只是尝试比较 time() 和microtime() 和一个简单的脚本(usleep 只是为了限制数据输出):

<?php
for($i = 0; $i < 500; $i++) {
    $microtime = microtime();
    $time = time();
    list($usec, $sec) = explode(" ", $microtime);
    if ((int)$sec > $time) {
        echo $time . ' : ' . $microtime . '<br>';
    }
    usleep(50000);
}
?>

现在,由于在 $time 之前声明了 $microtime,我希望它更小,并且永远不会输出任何内容;然而,这显然不是这种情况,$time 有时会小于 microtime() 返回的秒数,如本例(截断)输出所示:

1344536674 : 0.15545100 1344536675
1344536675 : 0.15553900 1344536676
1344536676 : 0.15961000 1344536677
1344536677 : 0.16758900 1344536678

现在,这只是一个小差距;但是,我观察到一些系列的差异(相当)超过一秒……那么,这怎么可能呢?

最佳答案

如果您查看 time 的实现和 microtime ,您会发现它们完全不同:

由于 C time 调用仅精确到一秒,它也可能有意使用低保真时间源。

此外,在现代 x86_64 系统上,both C functions can be implemented without a system call by looking into certain CPU registers .如果您使用的是多核系统,这些寄存器可能无法跨内核完全匹配,这可能是一个原因。

造成差异的另一个潜在原因是 NTPd(计时守护进程)或其他一些用户空间进程正在更改时钟。通常,应通过 adjtime 避免这些影响。 .

所有这些理由都​​非常深奥。要进一步调试问题,您应该:

  • 确定操作系统和 CPU 架构(提示:并告诉我们!)
  • 尝试force the process on one core
  • 停止任何正在(或可能正在)调整系统时间的程序。

关于php time() 和 microtime() 有时不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11889809/

有关php time() 和 microtime() 有时不一致的更多相关文章

  1. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  2. ruby - Mongoid 3 中 Rails 模型的强一致性 - 2

    我希望特定模型的所有数据库交互都通过集群中的mongo主节点,因此我将模型设置为使用强一致性。classPhotoincludeMongoid::Documentwithconsistency::strongfield:number,type:Integer#let'ssayaphotonumberisuniqueinthedbvalidate:unique_numberend但这似乎不起作用,因为当我保存两张非常靠近的照片时,我仍然遇到验证错误。photo1#dbhasnumber=1forthisobjectphoto1.update_attributes(number:2)pho

  3. ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果? - 2

    gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就

  4. ruby - Ruby 中不一致的隐式哈希创建? - 2

    好的,所以我将我自己的DSL中的一些东西与Ruby进行了比较。他们都支持的一个结构是这个x=["key"=>"value"]知道数组和散列的区别,我会认为这是不合法的,但是在Ruby中的结果是[{"key"=>"value"}]这是为什么?有了这种语法,你为什么不能这样做x=("key"=>"value")为什么数组是隐式创建的哈希的特例? 最佳答案 另一个特殊情况是在函数调用中,考虑:deff(x)puts"OK:#{x.inspect}"endf("foo"=>"bar")=>OK:{"foo"=>"bar"}因此在某些情况下,

  5. ruby - 00.0 和 0.0 不一样吗? - 2

    我刚刚在编程语言ruby中发现了一个奇怪的问题,这不是什么大问题,但我就是不明白为什么会这样。如果有人知道我的问题的问题,我会很感兴趣。在ruby中你可以写成0或者00,没关系,结果是一样的。如果您运行0===00,您还会得到true,这意味着两个输入完全相同。0.0也等于0,所以逻辑上00.0也应该等于0.0但问题是,如果你尝试使用数字00.0那么你只会得到一个错误。例如,如果您运行:a=00.0你得到这个错误:syntaxerror,unexpectedtINTEGER当然我知道这是个小问题,但如前所述,我想了解为什么计算机不将00.0视为与0.0相同?

  6. ruby - 为什么 open ("url") 有时会返回 File 有时会返回 StringIO? - 2

    我有两个CSV文件存储在S3上。当我打开其中之一时,返回一个文件。当我打开另一个时,返回一个StringIO。fn1#=>"http://SOMEWHERE.s3.amazonaws.com/setup_data/d1/file1.csv"open(fn1)#=>#fn2#=>"http://SOMEWHERE.s3.amazonaws.com/setup_data/d2/d3/file2.csv"open(fn2)#=>#为什么?有没有办法用一致的数据类型打开它们?我需要将相同的数据类型String传递到CSV.read(open(file_url))中,如果有时它得到一个则它不起作

  7. ruby - if + else 和 if -> unless 不一致 - 2

    我今天在定义我解决的自定义RSpec匹配器时遇到了一个问题,但实际上看不出任何一种方法有效而另一种方法无效的原因,这是代码:方法1——if+else:RSpec::Matchers.define:have_success_messagedo|message|matchdo|page|ifmessage.nil?page.shouldhave_selector('div.alert.alert-success')elsepage.shouldhave_selector('div.alert.alert-success',text:message)endendend方法2--if后跟unl

  8. ruby-on-rails - 如何使用 Rails Faker gem 生成一致的数据? - 2

    为了用虚假数据填充我的Rails应用程序,我经常这样做:person=Person.create(:first_name=>Faker::Name.first_name,:last_name=>Faker::Name.last_name,:email=>Faker::Internet.email)这可能会产生一个像这样的人:Firstname:OliviaLastname:KuberaEmail:milan_nieklauson@bachmannjacob.net有没有办法生成更连贯的假数据,例如:Firstname:OliviaLastname:KuberaEmail:olivia_

  9. ruby-on-rails - 在 ruby​​/rails 中,如何对日期有时可能为空的日期值进行排序? - 2

    我想按游戏日期对我的游戏进行排序,但有时游戏日期可能为空,我会得到一个异常:undefinedmethod`to_datetime'fornil:NilClass@games=@teams.reduce([]){|memo,team|memo+team.games}.sort_by(&:game_date)有什么好的方法吗? 最佳答案 如果您只想删除没有日期的条目,最简单的解决方案-ar.select(&:date).sort_by(&:date)在末尾添加nils可以用ar.select(&:date).sort_by(&:dat

  10. ruby - 为什么带有无效参数的范围有时不会导致参数错误? - 2

    以下代码会导致参数错误:n=15(n%4==0)..(n%3==0)#=>badvalueforrange(ArgumentError)我认为这是因为它评估为:false..true并且范围内使用了不同类型的类:TrueClass和FalseClass。但是,以下代码不会引发错误。这是为什么?Enumerable#collect能捕捉到它吗?(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}#=>noerror稍后添加:如果fcn返回15,则只评估范围的前半部分deffcn(x)putsx15endif(fcn(1)%4==0)..(fcn(2)

随机推荐