2012-03-19 32 views
1

我有一個函數可以跟蹤通過腳本發生的事件。爲了有效利用我的資源,我決定壓縮它生成的數據。不過,我不斷收到此錯誤:帶文件讀寫錯誤的PHP gzuncompress

Unknown error type: [2] gzuncompress() [function.gzuncompress]: data error 

這裏的功能:

function eventlog($type, $message){ 
    // Types: account,run,queue,system 
    // Set up file name/location 
    $eventfile = '/myprivatedirectory/'.date('Ymd').$type.'.log'; 

    if(file_exists($eventfile)){ 
     while(!is_writable($eventfile)){clearstatcache();} 

     $fh_log = fopen($eventfile,'r+'); 
     flock($fh_log, LOCK_EX); 
     $logcontents = gzuncompress(fread($fh_log,filesize($eventfile))); 

     rewind($fh_log); 
     ftruncate($fh_log, 0); 

     $logcompressed = gzcompress($logcontents.$message."\n"); 
     fwrite($fh_log,$logcompressed); 
     flock($fh_log, LOCK_UN); 
     fclose($fh_log); 
    } else { 
     $fh_log = fopen($eventfile,'w'); 
     flock($fh_log, LOCK_EX); 
     $logcompressed = gzcompress($message."\n"); 
     fwrite($fh_log,$logcompressed); 
     flock($fh_log, LOCK_UN); 
     fclose($fh_log); 
    } 
} 

所以每天,在午夜,如上述任何事件的發生創造了一個新的錯誤日誌(帳戶,運行,隊列,系統),否則每個新事件都附加到尊重日誌文件。

我很想保持壓縮,但我不能有這些錯誤,任何人都可以請幫忙嗎?提前致謝。

+1

'file_put_contents'會爲您節省很多麻煩。 – Jon 2012-03-19 10:12:54

+0

我正在用'file_get_contents'來試試這個,至今沒問題。 – 2012-03-19 21:17:52

回答

1

我認爲這個實現是錯誤的,我不會建議你使用gzcompress($ message。「\ n」);每封郵件......

,我認爲你應該做的是,在這一天結束時,你可以壓縮整個日誌文件,這是更有效的

保存使用

file_put_contents 

您的信息在在一天結束的時候

$eventfile = '/myprivatedirectory/'.date('Ymd').$type.'.log'; 
$eventfileCompressed = '/myprivatedirectory/'.date('Ymd').$type.'.gz'; 
$gz = gzopen($eventfileCompressed ,"w9"); 
gzwrite($gz, file_get_contents($eventfile)); 
gzclose($gz); 

讀取文件

$zd = gzopen($eventfileCompressed,"r"); 
$zr = gzread($zd,$fileSize); 
gzclose($zd); 

這種方法可以爲您節省更多的處理能力

+0

你是對的,這是最好的選擇,但是,我的所有cron斑點都已經滿了,我只需要將它粘貼到另一個cron的末尾。 – 2012-03-19 21:18:57