예제 #1
0
 /**
  * 残す数を指定してキャッシュを削除する
  *
  * @param int $length
  * @param string $type
  * @return int
  */
 public static function trim($length, $type = null)
 {
     // $lengthが負数の場合は削除しない
     if ($length < 0) {
         return false;
     }
     $prefix = self::getKeyPrefix($type);
     // $lengthがゼロの場合は全件削除
     if ($length == 0) {
         $numRemoved = MatomeCacheDataStore::clear($prefix);
         if ($numRemoved === false) {
             return false;
         }
         MatomeCacheMetaDataStore::clear($prefix);
         return $numRemoved;
     }
     // 更新時刻順にソートして$length+1番目のレコードを取得
     $kvs = MatomeCacheDataStore::getKVS();
     $orderBy = array('mtime' => 'DESC', 'key' => 'DESC');
     $result = $kvs->getAll($prefix, $orderBy, 1, $length, true);
     if (empty($result)) {
         return 0;
     }
     $key = key($result);
     $mtime = current($result)->mtime;
     $query = 'DELETE FROM $__table WHERE ' . P2KeyValueStore::C_KEY_BEGINS . ' AND $__mtime <= :mtime';
     // 見つかったレコードと、それより更新時刻が古いデータを削除
     $stmt = $kvs->prepare($query);
     $kvs->bindValueForPrefixSearch($stmt, $prefix);
     $stmt->bindValue(':mtime', $mtime, PDO::PARAM_INT);
     if ($stmt->execute()) {
         $numRemoved = $stmt->rowCount();
     } else {
         return false;
     }
     // メタデータも削除
     $kvs = MatomeCacheMetaDataStore::getKVS();
     $stmt = $kvs->prepare($query);
     $kvs->bindValueForPrefixSearch($stmt, $prefix);
     $stmt->bindValue(':mtime', $mtime, PDO::PARAM_INT);
     if ($stmt->execute()) {
         if ($stmt->rowCount() != $numRemoved) {
             // メタデータの方が一瞬遅れて挿入されるため、ごく稀にデータの
             // mtimeとメタデータのmtimeが異なることがあり、ここに到達する
             $kvs->delete($key);
         }
     }
     // 削除したデータ数を返す
     return $numRemoved;
 }