DiskSpace.php

This commit is contained in:
Anthony Axenov 2022-01-11 08:06:43 +08:00
parent 0256d7ae4f
commit f0a88b3c96
Signed by: anthony
GPG Key ID: EA9EC32FF7CCD4EC

97
php/DiskSpace.php Normal file
View File

@ -0,0 +1,97 @@
<?
/**
* Простой класс для получения данных о пространстве на диске, разделе, в директории
* Может работать некорректно на shared-хостингах и при попытке получить данные
* о корневом разделе.
* https://gist.github.com/anthonyaxenov/5db7be8b514f30ab2658150f2c018740
*/
class DiskSpace
{
/**
* Возвращает размер свободного пространства в байтах
*
* @see https://www.php.net/manual/ru/function.disk-free-space.php
* @param string $path Директория или раздел диска
* @return float Размер свободного пространства в байтах
*/
public static function getFree($path)
{
return disk_free_space($path);
}
/**
* Возвращает общий размер
*
* @see https://www.php.net/manual/ru/function.disk-total-space.php
* @param string $path Директория или раздел диска
* @return float Общий размер в байтах
*/
public static function getTotal($path)
{
return disk_total_space($path);
}
/**
* Возвращает размер занятого пространства в байтах
*
* @param string $path Директория или раздел диска
* @return float Размер занятого пространства в байтах
*/
public static function getOccupied($path)
{
return self::getTotal($path) - self::getFree($path);
}
/**
* Возвращает округлённый размер с единицей измерения (Кб, Мб и т.д.)
*
* @see https://www.php.net/manual/ru/function.disk-total-space.php#75971
* @param float $bytes Количество байт
* @return string Форматированная строка
*/
private static function format($bytes)
{
$symbols = ['Б', 'Кб', 'Мб', 'Гб', 'Тб', 'Пб', 'Эб', 'Зб', 'Йб'];
$exp = floor(log($bytes) / log(1024));
return sprintf('%.2f ' . $symbols[$exp], ($bytes / pow(1024, floor($exp))));
}
/**
* Возвращает все данные о пространстве
*
* @param string $path Директория или раздел диска
* @return array Информация о пространстве
*/
public static function get($path)
{
$free_bytes = self::getFree($path);
$total_bytes = self::getTotal($path);
$occ_bytes = self::getOccupied($path);
return [
'free' => self::format($free_bytes),
'free_bytes' => $free_bytes,
'occupied' => self::format($occ_bytes),
'occupied_bytes' => $occ_bytes,
'total' => self::format($total_bytes),
'total_bytes' => $total_bytes,
];
}
}
// Использование:
$path = $_SERVER['DOCUMENT_ROOT'];
$info = DiskSpace::get($path);
print_r($info);
/* Результат:
Array
(
[free] => 67.17 Гб
[free_bytes] => 72120483840
[occupied] => 1.39 Тб
[occupied_bytes] => 1528753938432
[total] => 1.46 Тб
[total_bytes] => 1600874422272
)
*/