/** * 残す数を指定してキャッシュを削除する * * @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; }