2011-11-17 23 views
5

Tôi gặp sự cố lạ với PHP và tập lệnh C sử dụng thời gian hiện tại. chương trình của tôi là một chút phức tạp, nhưng vấn đề thu hẹp bản thân như thế này:Chạy mã C với mktime bên trong lệnh exec của PHP

tôi có mã này C mà in ngày 1 phút trước, ngày hiện tại, và ngày 1 phút từ bây giờ:

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

khi tôi chạy này trong vỏ, tôi nhận được kết quả chính xác (định dạng in là ngày của tháng, giờ, phút):

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

Tuy nhiên, khi tôi thực hiện nó thông qua PHP tôi nhận được kết quả kỳ lạ. Đây là mã PHP:

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

Và đây là kết quả:

17 20 7 
17 17 8 
17 14 9 

Số giờ rõ ràng là sai. Bất cứ ai có bất kỳ ý tưởng về những gì có thể gây ra điều này?

+0

Bạn nhận được gì khi bạn 'var_dump ($ output)'? – jprofitt

+0

@jprofitt 'mảng (3) {[0] => chuỗi (8)" 17 17 40 "[1] => chuỗi (8)" 17 14 41 "[2] => chuỗi (8)" 17 11 42 "}' – nmat

+0

Bất kỳ lý do cụ thể nào tại sao bạn muốn sử dụng C để tìm nạp thông tin ngày? Có gì sai với các hàm ngày tháng dựng sẵn của PHP? – NullUserException

Trả lời

3

Vấn đề là với mã C, không phải là mã PHP:

Khi bạn làm điều này:

rawtime = mktime(ptm); 

Con trỏ ptm được sửa đổi bởi mktime chức năng. Do đó, nếu bạn làm điều này:

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

Bạn đang thực sự thao tác con trỏ hai lần, vì thế mà kết quả kỳ lạ.

Thay vì những điều trên, chỉ cần làm:

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

Bạn sẽ nhận được kết quả mong đợi. Vì vậy, mã vòng lặp hoàn chỉnh for sẽ là:

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

Cảm ơn bạn. Điều đó giải quyết nó. Tôi không biết rằng 'mktime' đã sửa đổi con trỏ. Nhưng tại sao nó làm việc trong shell chứ không phải trong PHP? – nmat

+0

@nmat: Thành thực mà nói? Không ý kiến. Nó không nên làm việc ở tất cả ở nơi đầu tiên. Có lẽ có điều gì đó thiếu trong ví dụ của bạn rằng tôi cần trả lời câu hỏi đó. – netcoder

+0

Không thực sự. Tôi thực sự đã sao chép và dán vào một tệp khác trước khi đăng ở đây để đảm bảo những gì đang diễn ra. Tôi thấy [ở đây] (http://www.cplusplus.com/reference/clibrary/ctime/mktime/) rằng giá trị trả về của mktime là "thời gian quy định kể từ khi Epoch được mã hóa dưới dạng giá trị của time_t kiểu" (nếu tôi đã không bỏ qua phần "Giá trị trả về", tôi cũng sẽ đọc rằng nó sửa đổi con trỏ). Dù sao, những gì tôi đã viết thực sự là thừa, nhưng không nên cho kết quả sai tôi nghĩ rằng ... – nmat

Các vấn đề liên quan