За последние 24 часа нас посетили 22690 программистов и 1211 роботов. Сейчас ищут 779 программистов ...

Глюк с microtime() имеется?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Chushkin, 10 фев 2014.

  1. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Это только у меня в последних релизах microtime(1) глючит? (5.3, 5.4)
    Время (микросекунды) между двумя измерениями показывает или ноль или заметно больше, чем должно быть.
    Сейчас стоит две рабочие версии - 5.3.13 и 5.3.28. В первой всё Ок, во второй - глюк. Поставил 5.4.25 - тот же глюк.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    у меня нету. 5.4.23
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Тоже нету
     
  4. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Ха, кажись нашёл...
    цитата (5.3.24): "Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT'])."
    Здесь явно и накосячили ... линуксоиды :(
    Не поленился - проверил 5.3.23 и 5.3.24. В 23 норма, в 24 глюк. Живучий глюк попался - почти год, с апреля 2013, живёт. Явно и в 5.5 тоже, но проверять лень.
    п.с.
    Возможно у вас не проявляется явно. Я заметил на запросах к БД: для запросов с временем выполнения порядка 0.001 сек 5.3.24 в основном показывает 0, иногда ~0.01. В 5.3.23 нормально - ~0.001 и выдаёт, как положено.
    п.п.с.
    Удивительно, как никто на него не нарвался. Или народ такой доверчевый, - "Сказано микросекунды, значит микросекунды, а не хрень, и точка!" :)
     
  5. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Проверил 5.5.10 - тот же глюк.
    Похоже линуксоиды не собираются его исправлять... :(
     
  6. INETCHIK

    INETCHIK Активный пользователь

    С нами с:
    13 фев 2014
    Сообщения:
    35
    Симпатии:
    0
    Я неделю тому назад заметил когда использовал sleep(1)
    Код (PHP):
    1. <?php echo microtime(true);sleep(1);echo'<br>'.microtime(true);
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Chushkin, дай код для тестов. без базы, разумеется. я не могу добиться ошибки. PHP 5.4.12 Win 64bit, 5.4.4 Debian 32bit

    Добавлено спустя 5 минут 55 секунд:
    offtopic: используй что-нибудь вроде number_format($delta, 6) чтобы гарантировать вывод с нужной точностью
     
  8. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Лучше всего заметно при доступе к БД:
    Код (Text):
    1. <!DOCTYPE html><html><head>
    2. </head><body><pre>
    3. <?php
    4. $sql = new \mysqli('', 'root', '', 'test');
    5. for($q=1; $q<=10; $q++) {
    6.     $t = microtime(1);
    7.     $r = $sql->query("select benchmark(50000, rand(1))");
    8.     echo 'N ', $q, ': <b>',"\t", number_format(microtime(1) - $t, 5), '</b><br>';
    9. }
    10. ?>
    11. </pre></body></html>
    У меня типичный результат:
    Код (Text):
    1. ver:    5.5.10   5.3.23   5.3.13
    2. N 1:    0.00000  0.00222  0.00219
    3. N 2:    0.00000  0.00220  0.00217
    4. N 3:    0.00000  0.00219  0.00216
    5. N 4:    0.00000  0.00219  0.00216
    6. N 5:    0.00000  0.00225  0.00216
    7. N 6:    0.00000  0.00225  0.00216
    8. N 7:    0.01560  0.00227  0.00227
    9. N 8:    0.00000  0.00229  0.00222
    10. N 9:    0.00000  0.00221  0.00219
    11. N 10:   0.00000  0.00217  0.00216
    Как уже говорил, такая хрень началась с версии 5.3.24 год назад (примерно) и до сих пор глюк не исправлен.
    п.с. Хм, хороший пример главной причины, почему я не люблю линуксоидов...

    Смешно, угу... ;)
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    смешно или нет, а вполне может объяснить некоторые "глюки"
    5.4.4 Debian 32bit
    Код (Text):
    1. N 1:    0.01376
    2. N 2:    0.01405
    3. N 3:    0.01358
    4. N 4:    0.01365
    5. N 5:    0.01358
    6. N 6:    0.01344
    7. N 7:    0.01361
    8. N 8:    0.01352
    9. N 9:    0.01365
    10. N 10:   0.01355
     
  10. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Уточнение: тестировал под Win7 x64, PHP x32.

    Добавлено спустя 5 минут 45 секунд:
    Смешно в том, что Вы это мне советуете.
    Как бы мой период "студента" закончился ещё в прошлом веке. ;)
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    без обид! ошибки всегда нелепые, это раз. у меня воспроизвести не получается, это два. насколько я понимаю описание багов с REQUEST_TIME и REQUEST_TIME_FLOAT, они про другое — про то что разные таймеры могут иметь разную природу.

    еще чуйка подсказывает, что проблема не должна зависеть от использования mysqli, так зачем настаивать на ее присутствии в тесте? без БД не ошибки не случается?

    истина где-то рядом. например в виртуализации и непредсказуемых лагах.

    peace!
     
  12. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Выше я уточнил - Win7. Возможно проблема в windows-версии PHP. Под юниксом не проверял, - вся разработка и отладка ведётся под вин, пока что.
    Собственно, мне был бы пофиг этот глюк, если бы не понадобилось измерять время запросов в режиме отладки.
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    5.4 под Win7 (64bit) тоже не воспроизвел ошибку.

    теоретически, если таймер имеет ограниченную точность, то картина должна быть именно такой: то дельта будет то 0, то неправдоподобно много. только с чего вдруг твоя версия использует такой таймер непонятно.

    кстати, мой виндовый php неродной сборки, т.к. хотелось 64бита, взял сборку Anindya. так что фиг знает, может твоя ситуация типичная, а моя нет. вот этот тест из багрепорта у тебя какую точность покажет?
     
  14. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    У меня 5.3.23 и ранее стабильно работает, последующие версии стабильно глючат. Настройки идентичны, PHP и Apache. Среда - голые PHP и Apache, никаких надстроек (отладчиков, ускорителей и т.п.).
    Происки Барабашки наверное :D

    Добавлено спустя 2 минуты 9 секунд:
    Дело не в железе. Ещё раз, - до версии 5.3.24 всё нормально работает, с 5.3.24 по текущую глючит.
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    какой-то ты возбудимый! кто сказал про железо?
    в винде программные таймеры базируются либо на GetTickCount() с реальной точностью 10-16мс, либо на QueryPerformanceCounter() реальная точность которого зависит от чипсета, но это наносекунды, очень высокая точность. соответственно в пыху могут впилить либо тот, либо другой. могу только предложить пользоваться алтьтернативной сборкой, если это важно для тебя.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    обычное дело, если между измерениями экстремально короткий промежуток (единичные микросекунды).
     
  17. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    см.выше реальные цифры - там милисекунды.

    Добавлено спустя 1 минуту 6 секунд:
    Станеш тут возбудимым, когда приходится на 5.3.23 торчать, не один месяц :(
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
  19. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Кстати, без БД тоже глючит.
    Например тут видно:
    Код (Text):
    1. <!DOCTYPE html><html><head>
    2. </head><body><pre>
    3. <?php // начиная с версии 5.3.24, microtime(1) не работает (глюк)
    4. for($q=1; $q<=10; $q++) {
    5.     $t = microtime(1);
    6.     for($i=0;$i<5000;$i++) { $s = strtoupper('lkjfakyiwuycxmzxncer'); }
    7.     echo 'N ', $q, ': <b>',"\t", number_format(microtime(1) - $t, 5), '</b><br>';
    8. }
    9. ?>
    10. </pre></body></html>
    Результаты у меня такие:
    Код (Text):
    1.         5.5.10   5.3.23
    2. N 1:    0.00700  0.00891
    3. N 2:    0.00600  0.00890
    4. N 3:    0.00500  0.00891
    5. N 4:    0.00500  0.00413
    6. N 5:    0.00500  0.00403
    7. N 6:    0.00400  0.00383
    8. N 7:    0.00500  0.00409
    9. N 8:    0.00500  0.00401
    10. N 9:    0.00300  0.00396
    11. N 10:   0.00300  0.00397
    По ним видно, что у 5.5.10 почему-то 4-5-ые знаки нулевые, всегда. (дальше могут быть цифры, но думаю это мусор какой-то). В 5.5.23 всё Ок - микросекунды есть всегда. Очень похоже на глюк в сборке (как минимум - вин-сборке).
     
  20. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Win7 x64, PHP 5.5.20 x32 - глюк не исправлен
    Win7 x64, PHP 5.6.4 x32 - глюк не исправлен

    год глюк не исправляется ... печалька :(
    Хотя и не удивительно, - линуксоиды они и в PHP линуксоиды :(
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    а линуксойды тут каким боком? если разрабы конкретной маленько-мягкой операционки нафурычили с таймером то конечно линуксойды виноваты... заговор линуксойдов против... рукожопых авторов винды видимо.
     
  22. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    "Чукча не читатель, Чукча писатель" (с) народная мудрость ;)
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Просто разрабам PHP кажется не очень важна версия под винду. Судя этой баге и по тому, что 64бит на винде у них "experimental", т.е. фиг его знает насколько рабочий :)

    P.S. У меня на винде по прежнему "неофициальная сборка" PHP в которой нет бага с микросекундами.
     
  24. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Угу. Основное отличие линуксоидов от нормальных разрабов именно в этом - они делают для себя, а юзеры у них где-то под плинтусом по приоритету. :)
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Я ни разу не использовал эту функцию в реальном проекте. Разве что uniqid вроде сам её использует. Поэтому так ли важно, что она на винде глючит? И, кстати, не разу не работал с реальным php-проект на windows-серверах