path(''); /** @var array{total_bytes: int, free_bytes: int, used_bytes: int, used_percent: float, free_percent: float, total_human: string, free_human: string, used_human: string}|null */ return Cache::remember( 'disk-space:'.md5($path), now()->addSeconds(30), fn () => $this->measure($path), ); } /** * @return array{ * total_bytes: int, * free_bytes: int, * used_bytes: int, * used_percent: float, * free_percent: float, * total_human: string, * free_human: string, * used_human: string * }|null */ private function measure(string $path): ?array { $total = @disk_total_space($path); $free = @disk_free_space($path); if ($total === false || $free === false || $total <= 0) { return null; } $totalBytes = (int) $total; $freeBytes = (int) max(0, $free); $usedBytes = (int) max(0, $totalBytes - $freeBytes); $usedPercent = round(($usedBytes / $totalBytes) * 100, 1); $freePercent = round(($freeBytes / $totalBytes) * 100, 1); return [ 'total_bytes' => $totalBytes, 'free_bytes' => $freeBytes, 'used_bytes' => $usedBytes, 'used_percent' => $usedPercent, 'free_percent' => $freePercent, 'total_human' => Number::fileSize($totalBytes, precision: 1), 'free_human' => Number::fileSize($freeBytes, precision: 1), 'used_human' => Number::fileSize($usedBytes, precision: 1), ]; } }