PHP gzuncompress с ошибками чтения и записи файла - PullRequest
1 голос
/ 19 марта 2012

У меня есть функция, которая отслеживает события, происходящие в сценарии.Стремясь эффективно использовать свои ресурсы, я решил сжать генерируемые ими данные.Тем не менее, я получаю эту ошибку:

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

Так что каждый день, в полночь, создается новый журнал ошибок при возникновении любого из вышеуказанных событий (account, run, queue, system), в противном случае каждое новое событие добавляется в уважительный файл журнала.

Я бы хотел сохранить сжатие, но я не могу продолжать иметь эти ошибки, может кто-нибудь помочь?Заранее спасибо.

1 Ответ

1 голос
/ 19 марта 2012

Я думаю, что реализация все неправильно, я бы не советовал вам 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);

Такой подход сэкономит вам больше вычислительной мощности

...