示例#1
0
 /**
  * ログ記入
  * @param $value 未使用(何も入れないこと)
  * @param $keeptimestamp 未使用(何も入れないこと)
  */
 public function set($value = '', $keeptimestamp = false)
 {
     // 設定
     $config = $this->config[$this->kind];
     // ログを取らない場合書き込まない
     if (!$config['use']) {
         return;
     }
     // 書き込むデーターを取得
     $rc = self::log_common_check();
     // ない場合終了
     if (empty($rc)) {
         return;
     }
     // ログを読み込む
     $data = parent::get(false);
     // 行数
     $count = count($data);
     // 更新するキーを取得
     if (!empty($config['updtkey'])) {
         // 最低限記録するキー
         $mustkey = isset($config['mustkey']) ? $config['mustkey'] : 0;
         // 保存するキーを定義から取得
         $_key = explode(':', $config['updtkey']);
         // 設定項目名を取得
         $name = self::set_fieldname();
         // 更新フラグ
         $set = false;
         // 行の分解
         for ($i = 0; $i < $count; $i++) {
             // ログの1行を配列に変換した後、項目名を付与する
             // $line = array(
             //     'ts' => 000000,
             //     'ip' => 127.0.0.1
             //     ...
             // );
             // みたいな感じになる
             $line = self::line2field($data[$i], $name);
             if (isset($line['ts']) && $line['ts'] <= UTIME - self::LOG_LIFE_TIME) {
                 // 一定期間過ぎたエントリは削除
                 continue;
             }
             // 行書き換えフラグ
             $sw_update = true;
             // 列の分解
             foreach ($_key as $idx) {
                 // 書き込む前のデーターと異なっていた場合
                 if (isset($rc[$idx]) && isset($line[$idx]) && $rc[$idx] != $line[$idx]) {
                     $sw_update = false;
                     break;
                 }
                 /*
                 					if (empty($rc[$idx]) || empty($line[$idx])) {
                 						$sw_update = false;
                 						break;
                 					}
                 					if ($rc[$idx] !== $line[$idx]) {
                 						$sw_update = false;
                 						break;
                 					}
                 */
             }
             if ($sw_update) {
                 // 書き換え
                 $data[$i] = self::array2table($rc);
                 $set = true;
                 break;
             }
         }
         unset($i);
         // 追記するデーター
         if (!$set) {
             if ($mustkey) {
                 if (self::log_mustkey_check($_key, $data)) {
                     $data[] = self::array2table($rc);
                 }
             } else {
                 $data[] = self::array2table($rc);
             }
         }
     } else {
         // 新規データー
         $data[] = self::array2table($rc);
     }
     // 配列の長さ制限
     if ($count > self::LOG_MAX_ENTRIES) {
         $i = 0;
         // 古いエントリから削除するため配列を反転
         foreach (array_reverse($data) as $line) {
             if ($i > self::LOG_MAX_ENTRIES) {
                 break;
             }
             $ret[] = $line;
             $i++;
         }
         // 戻す
         $data = array_reverse($ret);
     }
     // 保存(空行は削除)
     parent::set($data);
 }
示例#2
0
 /**
  * バックアップファイルの内容を圧縮形式に応じて取得する
  * TODO:gzとbz2解凍がスレッドセーフでない
  * @access    private
  *
  * @return    Array     ファイルの内容
  */
 private function read_sub($ext, $join)
 {
     // ファイルを取得
     $data = '';
     switch ($ext) {
         case '.txt':
             $data = parent::get();
             break;
         case '.lzf':
             $data = lzf_decompress(parent::get());
             break;
         case '.gz':
             $handle = gzopen($this->filename, 'r');
             while (!gzeof($handle)) {
                 $data .= gzread($handle, 1024);
             }
             gzclose($handle);
             break;
         case '.bz2':
             $handle = bzopen($this->filename, 'r');
             while (!feof($handle)) {
                 $data .= bzread($handle, 1024);
             }
             bzclose($handle);
             break;
     }
     // 取得した内容を改行ごとに配列として返す
     return $join ? $data : explode("\n", $data);
 }