2011-12-08 19 views
0

讀我有一個CGI環境文件的時間戳的一個問題。和CGI Perl - 文件時間戳不正確

我的CGI腳本被調用由cron每分鐘一次。

此CGI腳本從外部源獲取通過http一些文本數據(消息)並且將其寫入到文件中。 在此之前,它會檢查此文件的上次修改時間戳並讀取文件的舊內容。 我在看文件的時間戳與

$fileage = (-M $filename) * 24 * 60; 

如果文件時間戳超過5分鐘,新的消息是不相同的舊之一,它確實將其發送到其他來源。

下面參見代碼片段。

我現在的問題:劇本是每分鐘30〜50分鐘運行一次完美的,然後突然該文件的時候就開始,不要讓正確讀取的文件是否已經被緩存。 而不是返回正確的文件年齡應該總是約5至7分鐘,讀取文件的年齡增加到10分鐘,15分鐘,20分鐘等,雖然文件每隔幾分鐘不斷寫入。

系統是Linux 2.6.16.60-0.42.10-bigsmp,Perl版本:5.008008,Web服務器:Apache 2的

use CGI; 
[...] 
my $cgi = new CGI; 

[...] 

$fileagetolerance = 5; 
$filename = "message.txt"; 

$newmessage = .... read via http from other website ...; # this message changes most of the time every few minutes. 

$fileage = (-M $filename) * 24 * 60; # have the file age in minutes 
print "file age of ".$filename.": ".$fileage.", minimum value needed for special action: ".$fileagetolerance."<br>\n"; 


if (open(FILE, "<", $filename)) { 
    $lastmessage = <FILE>; 
    close (FILE); 
} else { 
    print "Couldn't read last message. Exiting<br>\n"; 
    die; 
} 

if ($newmessage eq $lastmessage) { 
    print "Last message is identical with new message. Exiting...<br>\n"; 
    die; 
} 

if ($fileage < $fileagetolerance) { 
    print "Last message was not long enough ago. Exiting...<br>\n"; 
    die; 
} 

sendItOut($newmessage); 

if (open(FILEOUT, ">", $filename)) { 
    print FILEOUT $newmessage; 
    close (FILEOUT); 
    print "Done.<br>\n"; 
} else { 
    print "Couldn't write last message.<br>\n"; 
} 
+0

你必須在有一些記錄 - 那麼你的日誌說會發生什麼? –

+2

我很努力地理解你爲什麼要寫一個從cron調用的CGI程序。是什麼讓它成爲一個CGI程序?至於你真正的問題,你有沒有嘗試開啓'嚴格使用'和'使用警告'? –

+0

在Perl中引入註釋#不與// ... – tadmc

回答

0

我看到錯字這裏: $fileage = (-M $tfilename) * 24 * 60; // have the file age in minutes。沒有這樣的VAR爲$tfilename ...

+0

在實際的代碼中沒有錯字,爲了清晰起見,我重命名了一些變量。但是,謝謝你的提示,我在上面糾正了它! –

+0

您可以使用簡單的代碼版本複製此行爲嗎? –