重い処理を複数実行する必要があるページの表示速度をあげるためキャッシュを導入してみましたが、30分や1時間など決まったキャッシュ時間の設定だけでは思うような結果にならなかったので、奇数時間・偶数時間と分数を指定してなるべく細かく時間差を作ってキャッシュを管理出来るようにしてみました。
奇数・偶数時間と分数を指定してキャッシュ時間を管理
use Illuminate\Support\Facades\Cache;
use Carbon\Carbon;
/**
* 奇数時間または偶数時間の指定分にキャッシュが切れるように有効期限(秒)を計算する
*
* @param string $mode モード("odd": 奇数時間, "even": 偶数時間)
* @param int $minuteTarget 目標分
* @return int 有効期限(秒)
*/
function getCustomExpiresAt(string $mode, int $minuteTarget): int {
$now = Carbon::now();
$hour = $now->hour;
$minute = $now->minute;
$targetTime = $now->copy();
// 奇数時間または偶数時間に基づいた調整
$isTargetEvenHour = $mode === "even";
$isCurrentHourEven = $hour % 2 === 0;
$shouldAdjustHour = ($mode === "odd" && $isCurrentHourEven) || ($isTargetEvenHour && !$isCurrentHourEven);
$shouldIncrementHour = $minute >= $minuteTarget || $shouldAdjustHour;
if ($shouldIncrementHour) {
$targetTime->addHour();
}
$targetHour = $targetTime->hour;
// 次のターゲット時間(奇数または偶数)に合わせて調整
if (($mode === "odd" && $targetHour % 2 === 0) || ($isTargetEvenHour && $targetHour % 2 !== 0)) {
$targetTime->addHour();
}
$targetTime->minute($minuteTarget)->second(0);
// 分が現在時刻を超えていなければ、さらに時間を加算
if ($now->greaterThanOrEqualTo($targetTime)) {
$targetTime->addHours(2); // 次の対象時間まで2時間加算
}
// 有効期限(秒)を計算
return $now->diffInSeconds($targetTime);
}
使用例
奇数時間の45分
// モード"odd", 分45: 奇数時間の45分にキャッシュを切れさせる
Cache::remember('cache_key_for_odd_hours_45', getCustomExpiresAt("odd", 45), function () {
// キャッシュするデータを取得
});
偶数時間の30分
// モード"even", 分30: 偶数時間の30分にキャッシュを切れさせる
Cache::remember('cache_key_for_even_hours_30', getCustomExpiresAt("even", 30), function () {
// キャッシュするデータを取得
});
動作環境情報
"macOS Sonoma" 14.3.1 "Docker Desktop" 4.17.0 "Laravel Framework" 10.11.0 "Laravel Sail"
コメント