Это только у меня в последних релизах microtime(1) глючит? (5.3, 5.4) Время (микросекунды) между двумя измерениями показывает или ноль или заметно больше, чем должно быть. Сейчас стоит две рабочие версии - 5.3.13 и 5.3.28. В первой всё Ок, во второй - глюк. Поставил 5.4.25 - тот же глюк.
Ха, кажись нашёл... цитата (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 и выдаёт, как положено. п.п.с. Удивительно, как никто на него не нарвался. Или народ такой доверчевый, - "Сказано микросекунды, значит микросекунды, а не хрень, и точка!"
Я неделю тому назад заметил когда использовал sleep(1) Код (PHP): <?php echo microtime(true);sleep(1);echo'<br>'.microtime(true);
Chushkin, дай код для тестов. без базы, разумеется. я не могу добиться ошибки. PHP 5.4.12 Win 64bit, 5.4.4 Debian 32bit Добавлено спустя 5 минут 55 секунд: offtopic: используй что-нибудь вроде number_format($delta, 6) чтобы гарантировать вывод с нужной точностью
Лучше всего заметно при доступе к БД: Код (Text): <!DOCTYPE html><html><head> </head><body><pre> <?php $sql = new \mysqli('', 'root', '', 'test'); for($q=1; $q<=10; $q++) { $t = microtime(1); $r = $sql->query("select benchmark(50000, rand(1))"); echo 'N ', $q, ': <b>',"\t", number_format(microtime(1) - $t, 5), '</b><br>'; } ?> </pre></body></html> У меня типичный результат: Код (Text): ver: 5.5.10 5.3.23 5.3.13 N 1: 0.00000 0.00222 0.00219 N 2: 0.00000 0.00220 0.00217 N 3: 0.00000 0.00219 0.00216 N 4: 0.00000 0.00219 0.00216 N 5: 0.00000 0.00225 0.00216 N 6: 0.00000 0.00225 0.00216 N 7: 0.01560 0.00227 0.00227 N 8: 0.00000 0.00229 0.00222 N 9: 0.00000 0.00221 0.00219 N 10: 0.00000 0.00217 0.00216 Как уже говорил, такая хрень началась с версии 5.3.24 год назад (примерно) и до сих пор глюк не исправлен. п.с. Хм, хороший пример главной причины, почему я не люблю линуксоидов... Смешно, угу...
смешно или нет, а вполне может объяснить некоторые "глюки" 5.4.4 Debian 32bit Код (Text): N 1: 0.01376 N 2: 0.01405 N 3: 0.01358 N 4: 0.01365 N 5: 0.01358 N 6: 0.01344 N 7: 0.01361 N 8: 0.01352 N 9: 0.01365 N 10: 0.01355
Уточнение: тестировал под Win7 x64, PHP x32. Добавлено спустя 5 минут 45 секунд: Смешно в том, что Вы это мне советуете. Как бы мой период "студента" закончился ещё в прошлом веке.
без обид! ошибки всегда нелепые, это раз. у меня воспроизвести не получается, это два. насколько я понимаю описание багов с REQUEST_TIME и REQUEST_TIME_FLOAT, они про другое — про то что разные таймеры могут иметь разную природу. еще чуйка подсказывает, что проблема не должна зависеть от использования mysqli, так зачем настаивать на ее присутствии в тесте? без БД не ошибки не случается? истина где-то рядом. например в виртуализации и непредсказуемых лагах. peace!
Выше я уточнил - Win7. Возможно проблема в windows-версии PHP. Под юниксом не проверял, - вся разработка и отладка ведётся под вин, пока что. Собственно, мне был бы пофиг этот глюк, если бы не понадобилось измерять время запросов в режиме отладки.
5.4 под Win7 (64bit) тоже не воспроизвел ошибку. теоретически, если таймер имеет ограниченную точность, то картина должна быть именно такой: то дельта будет то 0, то неправдоподобно много. только с чего вдруг твоя версия использует такой таймер непонятно. кстати, мой виндовый php неродной сборки, т.к. хотелось 64бита, взял сборку Anindya. так что фиг знает, может твоя ситуация типичная, а моя нет. вот этот тест из багрепорта у тебя какую точность покажет?
У меня 5.3.23 и ранее стабильно работает, последующие версии стабильно глючат. Настройки идентичны, PHP и Apache. Среда - голые PHP и Apache, никаких надстроек (отладчиков, ускорителей и т.п.). Происки Барабашки наверное Добавлено спустя 2 минуты 9 секунд: Дело не в железе. Ещё раз, - до версии 5.3.24 всё нормально работает, с 5.3.24 по текущую глючит.
какой-то ты возбудимый! кто сказал про железо? в винде программные таймеры базируются либо на GetTickCount() с реальной точностью 10-16мс, либо на QueryPerformanceCounter() реальная точность которого зависит от чипсета, но это наносекунды, очень высокая точность. соответственно в пыху могут впилить либо тот, либо другой. могу только предложить пользоваться алтьтернативной сборкой, если это важно для тебя.
см.выше реальные цифры - там милисекунды. Добавлено спустя 1 минуту 6 секунд: Станеш тут возбудимым, когда приходится на 5.3.23 торчать, не один месяц
Кстати, без БД тоже глючит. Например тут видно: Код (Text): <!DOCTYPE html><html><head> </head><body><pre> <?php // начиная с версии 5.3.24, microtime(1) не работает (глюк) for($q=1; $q<=10; $q++) { $t = microtime(1); for($i=0;$i<5000;$i++) { $s = strtoupper('lkjfakyiwuycxmzxncer'); } echo 'N ', $q, ': <b>',"\t", number_format(microtime(1) - $t, 5), '</b><br>'; } ?> </pre></body></html> Результаты у меня такие: Код (Text): 5.5.10 5.3.23 N 1: 0.00700 0.00891 N 2: 0.00600 0.00890 N 3: 0.00500 0.00891 N 4: 0.00500 0.00413 N 5: 0.00500 0.00403 N 6: 0.00400 0.00383 N 7: 0.00500 0.00409 N 8: 0.00500 0.00401 N 9: 0.00300 0.00396 N 10: 0.00300 0.00397 По ним видно, что у 5.5.10 почему-то 4-5-ые знаки нулевые, всегда. (дальше могут быть цифры, но думаю это мусор какой-то). В 5.5.23 всё Ок - микросекунды есть всегда. Очень похоже на глюк в сборке (как минимум - вин-сборке).
Win7 x64, PHP 5.5.20 x32 - глюк не исправлен Win7 x64, PHP 5.6.4 x32 - глюк не исправлен год глюк не исправляется ... печалька Хотя и не удивительно, - линуксоиды они и в PHP линуксоиды
а линуксойды тут каким боком? если разрабы конкретной маленько-мягкой операционки нафурычили с таймером то конечно линуксойды виноваты... заговор линуксойдов против... рукожопых авторов винды видимо.
Просто разрабам PHP кажется не очень важна версия под винду. Судя этой баге и по тому, что 64бит на винде у них "experimental", т.е. фиг его знает насколько рабочий P.S. У меня на винде по прежнему "неофициальная сборка" PHP в которой нет бага с микросекундами.
Угу. Основное отличие линуксоидов от нормальных разрабов именно в этом - они делают для себя, а юзеры у них где-то под плинтусом по приоритету.
Я ни разу не использовал эту функцию в реальном проекте. Разве что uniqid вроде сам её использует. Поэтому так ли важно, что она на винде глючит? И, кстати, не разу не работал с реальным php-проект на windows-серверах