2011-07-14 17 views
7

No realmente, pero me encuentro con un problema donde una vez en una luna azul mientras se ejecuta este script, mi tiempo resulta en un número negativo. aquí es la parte del guión en el que está ocurriendo:PHP script ... ¿retrocede en el tiempo?

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"; 
    }  
} 

Como era de sospechar .. no debería haber nada de malo en restar segunda vez desde el primer y obtener una estimación aproximada de cuánto tiempo tomó el proceso .. sin embargo .. Si me quedo suficientes veces, a veces los resultados se imprimirán los datos del siguiente:

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 

esto es muy raro, pero esto es una salida exacta de mi último resultado. Entonces mis preguntas serían:

¿Cómo es esto posible? resultando en un "negativo" cuando esto claramente no debería suceder ..

¿Qué puedo hacer para evitar esto? ¿Hay una mejor manera de hacerlo? ¿microtime() no es confiable?

¿Alguien puede prestarme un 1981 DeLorean DMC-12 capaz de 88 mp/h?

+3

posible duplicado de [perfilado PHP con microtime(): ¿Tiempo negativo?] (Http://stackoverflow.com/questions/2607150/php-profiling-with-microtime-negative-time) – lonesomeday

+0

Whoa, eso es doc pesado. –

Respuesta

14

Suponiendo el tipo de datos incorrecto. El manual page of microtime lee:

Por defecto, microtime() devuelve una cadena de la forma "msec sec" [...]

Así que en realidad estás restando sólo los mseg valores como strings are converted to numbers tanto antes de la real resta tiene lugar.

Uso microtime(true) para obtener valores de coma flotante:

Si get_as_float se establece en TRUE, entonces microtime() devuelve un flotador [...]

+12

Una de esas maravillosas decisiones de diseño en PHP que realmente hacen que el lenguaje sea tan divertido de usar. –

Cuestiones relacionadas