2011-11-17 10 views
5

Tengo un problema extraño con PHP y un script en C que usa la hora actual. Mi programa es un poco más compleja, pero el problema se estrecha en sí a esto:Ejecutando el código C con mktime dentro del ejecutivo de PHP

tengo este código C que imprime atrás la fecha de 1 minuto, la fecha actual y la fecha de 1 minuto de ahora:

#include <time.h> 
#include <stdio.h> 

int main(int argc, char **argv){ 
    char date[9]; 
    time_t rawtime; 
    struct tm * ptm; 
    int i; 

    time(&rawtime); 
    ptm = gmtime(&rawtime); 
    ptm->tm_min--; 

    for(i = 0; i < 3; i++){ 
    rawtime = mktime(ptm); 
    ptm = gmtime(&rawtime); 
    snprintf(date, 9, "%d %d %d", ptm->tm_mday, ptm->tm_hour, ptm->tm_min); 
    printf("%s\n", date); 

    ptm->tm_min++; 
    } 
    return 0; 
} 

cuando ejecuto esto en la cáscara, consigo resultados correctos (el formato de impresión es día del mes, hora, minuto):

$ ./test 
17 20 7 
17 20 8 
17 20 9 

Sin embargo, cuando ejecuto a través de PHP que obtener resultados extraños. Este es el código PHP:

<?php 
exec("path_to_exec/test", $output); 
echo "$output[0]<br/>"; 
echo "$output[1]<br/>"; 
echo "$output[2]<br/>"; 
?> 

Y esta es la salida:

17 20 7 
17 17 8 
17 14 9 

el horario es claramente erróneo. Alguien tiene alguna idea de lo que podría estar causando esto?

+0

¿Qué se obtiene cuando se 'var_dump ($ salida)'? – jprofitt

+0

@jprofitt 'matriz (3) {[0] => cadena (8)" 17 17 40 "[1] => cadena (8)" 17 14 41 "[2] => cadena (8)" 17 11 42 "}' – nmat

+0

¿Alguna razón en particular por la que desea usar C para obtener información de fecha? ¿Qué pasa con las funciones de fecha incorporadas de PHP? – NullUserException

Respuesta

3

el problema es con el código C, no el código PHP:

Al hacer esto:

rawtime = mktime(ptm); 

El puntero ptm es modificado por la función mktime. Por lo tanto, si usted hace esto:

rawtime = mktime(ptm); 
ptm = gmtime(&rawtime); 

En realidad estás manipular el puntero doble, por lo tanto, los resultados extraños.

En lugar de lo anterior, sólo que:

mktime(ptm); 
snprintf(...); 

obtendrá el resultado esperado. Por lo tanto, el código for bucle completo sería:

mktime(ptm); 
snprintf(date, 9, "%d %d %d", ptm->tm_mday, ptm->tm_hour, ptm->tm_min); 
printf("%s\n", date); 
ptm->tm_min++; 
+0

Gracias. Eso lo resolvió No sabía que 'mktime' modificaba el puntero. Pero, ¿por qué funciona en el shell y no en PHP? – nmat

+0

@nmat: ¿Honestamente? Ni idea. No debería haber funcionado para nada en primer lugar. Probablemente falte algo en su ejemplo que necesitaría responder eso. – netcoder

+0

No realmente. De hecho, copié y pegué esto en un archivo diferente antes de publicar aquí para asegurarme de lo que estaba sucediendo. Vi [aquí] (http://www.cplusplus.com/reference/clibrary/ctime/mktime/) que el valor de retorno de mktime era "el tiempo especificado desde que la Epoca se codificó como un valor de tipo time_t" (si no se había saltado a la sección "Valor devuelto", también habría leído que modifica el puntero). De todos modos, lo que escribí es de hecho redundante, pero no debería estar dando resultados equivocados, creo ... – nmat

Cuestiones relacionadas