2011-11-17 8 views
5

Sto avendo un problema strano con PHP e uno script C che utilizza l'ora corrente. Il mio programma è un po 'complessa, ma il problema si restringe a questo:codice C Correndo con mktime all'interno exec di PHP

ho questo codice C che stampa la data del 1 minuto fa, la data corrente, e la data di 1 minuto dalla società:

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

quando eseguo questo nella shell, ottengo risultati corretti (il formato di stampa è il giorno del mese, ora, minuto):

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

Tuttavia, quando eseguo attraverso PHP ottengo risultati strani. Questo è il codice PHP:

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

E questo è l'output:

17 20 7 
17 17 8 
17 14 9 

Le ore sono chiaramente sbagliato. Qualcuno ha qualche idea di cosa potrebbe causare questo?

+0

Che cosa si ottiene quando si 'var_dump ($ output)'? – jprofitt

+0

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

+0

Qualche ragione particolare per cui vuoi usare C per recuperare informazioni sulla data? Cosa c'è di sbagliato con le funzioni di data built-in di PHP? – NullUserException

risposta

3

Il problema è con il codice C, non il codice PHP:

Quando si esegue questa operazione:

rawtime = mktime(ptm); 

Il puntatore ptm viene modificato dalla funzione mktime. Pertanto, se si fa questo:

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

si sta effettivamente manipolare il puntatore due volte, quindi i risultati strani.

Invece di quanto sopra, basta fare:

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

si otterrà il risultato atteso. Quindi, il codice for ciclo completo sarebbe:

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

Grazie. Questo l'ha risolto. Non sapevo che 'mktime' ha modificato il puntatore. Ma perché funziona nella shell e non in PHP? – nmat

+0

@nmat: Onestamente? Nessuna idea. Non avrebbe dovuto funzionare affatto in primo luogo. Probabilmente c'è qualcosa che manca nel tuo esempio di cui dovrei rispondere. – netcoder

+0

Non proprio. Ho effettivamente copiato e incollato questo in un file diverso prima di postare qui per essere sicuro di quello che stava accadendo. Ho visto [qui] (http://www.cplusplus.com/reference/clibrary/ctime/mktime/) che il valore di ritorno di mktime era "il tempo specificato dal Epoch codificato come un valore di tipo time_t" (se mi non era saltato nella sezione "Valore di ritorno", avrei anche letto che modifica il puntatore). Ad ogni modo, quello che ho scritto è davvero superfluo, ma non dovrebbe dare risultati sbagliati penso ... – nmat