PHP скрипт ... уходит в прошлое? - PullRequest
7 голосов
/ 14 июля 2011

Не совсем, но я сталкиваюсь с проблемой, когда во время выполнения этого сценария однажды в синей луне мое время приводит к отрицательному числу.Вот часть сценария, где это происходит:

public function execute()
{
    $time1 = microtime();
    foreach($this->tables as $table)
    {
        if($this->buildQuery($table))
        {
            if($this->submitQuery($table))
            {
                $time2 = microtime() - $time1;
                echo "Sync Successful({$time2}s).. $table <br /> \n";
                //log
            }
        }
        else echo "No data to sync in $table";
    }    
}

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

Sync Successful(0.062936s).. users
Sync Successful(-0.86901s).. profile
Sync Successful(-0.798774s).. groups
Sync Successful(-0.718851s).. phonebook
Sync Successful(-0.711768s).. products
No data to sync in locations

Это очень редко, но это точный вывод моего последнего результата.Поэтому мои вопросы будут такими:

Как это возможно? , что приведет к «отрицательному» результату, когда этого явно не должно произойти ..

Что я могусделать, чтобы избежать этого? Есть ли лучший способ сделать это?microtime() ненадежен?

Может ли кто-нибудь одолжить мне DeLorean DMC-12 1981 года, способный развивать скорость 88 м / ч?

1 Ответ

14 голосов
/ 14 июля 2011

Вы предполагаете, что неверный тип данных. Страница справочника microtime гласит:

По умолчанию microtime() возвращает строку в форме "msec sec" […]

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

Используйте microtime(true) дляполучить значения с плавающей точкой:

Если для get_as_float установлено значение TRUE, то microtime() возвращает значение с плавающей точкой […]

...