Запуск кода на C с помощью mktime внутри exec PHP - PullRequest
5 голосов
/ 18 ноября 2011

У меня странная проблема с PHP и скриптом C, который использует текущее время.Моя программа немного сложна, но проблема сводится к следующему:

У меня есть этот код C, который печатает дату 1 минуту назад, текущую дату и дату 1 минуту с этого момента:

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

Когда я запускаю это в оболочке, я получаю правильные результаты (формат печати - день месяца, час, минута):

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

Однако, когда я выполняю его через PHP, яполучить странные результаты.Это код PHP:

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

И это вывод:

17 20 7
17 17 8
17 14 9

Часы явно неправильные.Кто-нибудь имеет представление о том, что может быть причиной этого?

1 Ответ

3 голосов
/ 18 ноября 2011

Проблема в коде C, а не в коде PHP:

Когда вы делаете это:

rawtime = mktime(ptm);

Указатель ptm изменяется функцией mktime.Поэтому, если вы сделаете это:

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

На самом деле вы дважды манипулируете указателем , отсюда и странные результаты.

Вместо вышеперечисленного просто выполните:

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

Вы получите ожидаемый результат.Итак, полный код цикла for будет:

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