Php проверить свободное место на диске
Мне нужно убедиться, что у меня есть хотя бы 1 ГБ свободного дискового пространства, прежде чем приступить к работе с моей базой данных. Я ищу что-то вроде этого:
Является ли это возможным? (Я ничего не нашел об этом в документации).
PG: 9.3 и ОС: Linux / Windows
Смена размера Диска при помощи смены тарифа
Сменить тарифный план на более высокий Вы можете в личном кабинете.
Вам нужно на странице «Главное» в разделе «Виртуальный хостинг» нажмите на «Три точки» рядом с надписью Меню.
Далее откроется меню, нажмите кнопку «Изменить».
В открывшемся меню нажимаем кнопку «Сменить тариф» и выбираем нужный тарифный план, после чего добавляем данный тариф в «Корзину» и производим оплату.
Будем произведен расчет средств, которые необходимы для смены тарифа на более высокий.
User Contributed Notes 9 notes
For a non-looping way to add symbols to a number of bytes:
function getSymbolByQuantity ( $bytes ) $symbols = array( 'B' , 'KiB' , 'MiB' , 'GiB' , 'TiB' , 'PiB' , 'EiB' , 'ZiB' , 'YiB' );
$exp = floor ( log ( $bytes )/ log ( 1024 ));
return sprintf ( '%.2f ' . $symbol [ $exp ], ( $bytes / pow ( 1024 , floor ( $exp ))));
>
Beware of empty files!
// Wrong
$exp = floor ( log ( $bytes ) / log ( 1024 ));
//Correct
$exp = $bytes ? floor ( log ( $bytes ) / log ( 1024 )) : 0 ;
To find the total size of a file/directory you have to differ two situations:
(on Linux/Unix based systems only!?)
you are interested:
1) in the total size of the files in the dir/subdirs
2) what place on the disk your dir/subdirs/files uses
- 1) and 2) normaly differs, depending on the size of the inodes
- mostly 2) is greater than 1) (in the order of any kB)
- filesize($file) gives 1)
- "du -ab $file" gives 2)
so you have to choose your situation!
on my server I have no rights to use "exec du" in the case of 2), so I use:
$s = stat($file);
$size = $s[11]*$s[12]/8);
whitch is counting the inodes [12] times the size of them in Bits [11]
hopes this helps to count the used disk place in a right way. :-)
function roundsize($size) <
$i=0;
$iec = array("B", "Kb", "Mb", "Gb", "Tb");
while (($size/1024)>1) <
$size=$size/1024;
$i++;>
return(round($size,1)." ".$iec[$i]);>
Something that might go well with this function is the ability to list available disks. On Windows, here's the relevant code:
/**
* Finds a list of disk drives on the server.
* @return array The array velues are the existing disks.
*/
function get_disks () <
if( php_uname ( 's' )== 'Windows NT' ) <
// windows
$disks =` fsutil fsinfo drives `;
$disks = str_word_count ( $disks , 1 );
if( $disks [ 0 ]!= 'Drives' )return '' ;
unset( $disks [ 0 ]);
foreach( $disks as $key => $disk ) $disks [ $key ]= $disk . ':\\' ;
return $disks ;
>else <
// unix
$data =` mount `;
$data = explode ( ' ' , $data );
$disks =array();
foreach( $data as $token )if( substr ( $token , 0 , 5 )== '/dev/' ) $disks []= $token ;
return $disks ;
>
>
?>
EXAMPLE OF USE:
EXAMPLE RESULT:
Array
(
[1] => A:\
[2] => C:\
[3] => D:\
[4] => E:\
[5] => F:\
[6] => G:\
[7] => H:\
[8] => I:\
[9] => M:\
[10] => X:\
[11] => Z:\
)
Warning: This also finds empty disk drives (eg; CD or SMD drives or the more common floppy drive).
Warning2: If you want to find space usage using the info from my function, prepend the disk function with the "@", eg:
//This is a more readable way of viewing the returned float
// $Bytes contains the total number of bytes on "/"
$Bytes = disk_total_space ( "/" );
function dataSize ( $Bytes )
$Type =array( "" , "kilo" , "mega" , "giga" , "tera" );
$counter = 0 ;
while( $Bytes >= 1024 )
$Bytes /= 1024 ;
$counter ++;
>
return( "" . $Bytes . " " . $Type [ $counter ]. "bytes" );
>
?>
Very simple function that convert bytes to kilobytes, megabytes .
return sprintf("%0.2f Gb", $number/1024/1024/1024);
PHP 6 has already come to the market but still there are no standard function that can help retrieve directory size as it has to calculate disk space such as disk_total_space. Although we can use system level call such as exec() and system(), it is too risky to enable these function. So we look for an alternate method so as to calculate directory size.
Sol: retrieving directory size using php
function get_dir_size ( $dir_name ) $dir_size = 0 ;
if ( is_dir ( $dir_name )) if ( $dh = opendir ( $dir_name )) while (( $file = readdir ( $dh )) !== false ) if( $file != ” . ” && $file != “ .. ” ) if( is_file ( $dir_name . ” / ” . $file )) $dir_size += filesize ( $dir_name . ” / ” . $file );
>
/* check for any new directory inside this directory */
if( is_dir ( $dir_name . ” / ” . $file )) $dir_size += get_dir_size ( $dir_name . ” / ” . $file );
>
>
>
>
>
closedir ( $dh );
return $dir_size ;
>
$dir_name = “directory name here” ;
/* 1048576 bytes == 1MB */
$total_size = round (( get_dir_size ( $dir_name ) / 1048576 ), 2 ) ;
print “Directory $dir_name size : $total_size MB” ;
?>
Depending upon the size format you want to achieve, divide directory size by 1024 or 1024 * 1024 or 1024 * 1024 * 1024 for KB or MB or GB respectively.
Функция возвращает размер свободного пространства в байтах, доступного для использования в указанном каталоге или файловой системе.
Возвращаемые значения
Возвращает количество свободных байт в виде числа с плавающей точкой или false в случае возникновения ошибки.
Список параметров
Директория файловой системы или раздел диска.
Примечания
Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.
Как определить, чем занято место на диске хостинга?
В панели хостинга в меню слева нужно перейти в раздел «Статистика» → «Использование диска». В столбцах будет отражен размер папок с файлами.
Мы видим, что в нашем примере занимает больше всего места папка «www» — 434.91Мб
Далее мы можем удалить ненужные файлы по инструкции:
Примечания
Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.
Как очистить дисковое пространство?
Очистить дисковое пространство можно удалением ненужных файлов — например, файлы кэша. Рассмотрим данный способ более подробно.
Удаление файлов кэша:
В панели хостинга в меню слева перейдите в раздел «Главное» → пункт «Менеджер файлов».
Перейдите в папку с кэшем. Для сайтов на WordPress папку можно найти по пути www/ваш сайт/wp-content/cache. Выделите все содержимое каталога и очистите папку с помощью кнопки «Удалить».
Также Вы можете увеличить размер самого диска на услуге хостинга, если ненужных файлов на услуге нет. Для этого Вам нужно будет сменить тариф на более высокий.
Смотрите также
- disk_total_space() - Возвращает общий размер файловой системы или раздела диска
Примеры
// $df содержит размер свободного места в каталоге "/"
$df = disk_free_space ( "/" );
// В Windows:
$df_c = disk_free_space ( "C:" );
$df_d = disk_free_space ( "D:" );
?>
4 ответа
PostgreSQL в настоящее время не имеет функций, позволяющих напрямую открывать дисковое пространство.
Во-первых, какой диск? Рабочий экземпляр PostgreSQL часто выглядит так:
- /pg/pg94/ : RAID6 быстрого и надежного хранилища на RAID-контроллере BBU в режиме WB для каталогов и наиболее важных данных
- /pg/pg94/pg_xlog : быстрый и надежный массив RAID1 для журналов транзакций
- /pg/tablespace-lowredundancy : RAID10 с быстрым дешевым хранилищем для таких вещей, как индексы и UNLOGGED таблицы, которые вам не нужно терять, поэтому вы можете использовать хранилище с меньшей избыточностью.
- /pg/tablespace-bulkdata : RAID6 или аналогичный медленный ближний магнитный накопитель, используемый для старых журналов аудита, исторических данных, данных, предназначенных для записи, и других вещей, доступ к которым может быть более медленным.
- Журналы postgreSQL обычно снова где-то еще, но если они заполнятся, система все равно может остановиться. Где зависит от ряда параметров конфигурации, некоторые из которых вы вообще не видите в PostgreSQL, например параметры системного журнала.
Также есть тот факт, что «свободное» пространство не обязательно означает, что PostgreSQL может его использовать (подумайте: дисковые квоты, дисковое пространство, зарезервированное системой), и тот факт, что свободные блоки / байтов - не единственное ограничение, так как многие файловые системы также имеют ограничения на количество файлов (inodes).
Как SELECT pg_get_free_disk_space() сообщает об этом?
Информация о свободном дисковом пространстве может быть проблемой для безопасности. Если поддерживается, то по крайней мере, это будет доступно только суперпользователю.
Что вы можете сделать, так это использовать ненадежный процедурный язык, такой как plpythonu , чтобы делать вызовы операционной системы для опроса ОС хоста на предмет информации о дисковом пространстве, используя запросы к pg_catalog.pg_tablespace и используя < > из pg_settings , чтобы узнать, где PostgreSQL хранит данные в ОС хоста. Вы также должны проверить точки монтирования (unix / Mac) / точки соединения (Windows), чтобы определить, находятся ли pg_xlog и т. Д. В отдельном хранилище. Однако это все равно не поможет вам с местом для журналов.
Я бы очень хотел иметь SELECT * FROM pg_get_free_diskspace , который сообщал бы об основном пространстве datadir и любых точках монтирования или точках соединения в нем, например, для pg_xlog или pg_clog , а также сообщал бы о каждом табличном пространстве и любом точки монтирования внутри него. Это была бы функция, возвращающая набор. Тем не менее, кому-то, кому это небезразлично, придется потрудиться, чтобы реализовать его для всех целевых платформ , а сейчас никто не хочет, чтобы это было достаточно для выполнения работы.
А пока, если вы хотите упростить свои потребности:
- Единая файловая система
- Целевая ОС совместима с UNIX / POSIX, как Linux
- Система квот не включена
- Нет никакого процента зарезервированных корневых блоков
- исчерпание inode не является проблемой
Тогда вы можете CREATE LANGUAGE plpython3u; и CREATE FUNCTION функцию LANGUAGE plpython3u , которая делает что-то вроде:
В функции, которая returns bigint либо принимает datadir_path в качестве аргумента, либо обнаруживает его, выполняя запрос SPI, например SELECT setting FROM pg_settings WHERE name = 'data_directory' , из PL / Python.
Если вы также хотите поддерживать Windows, см. Межплатформенное пространство, оставшееся на томе с использованием python. Я бы использовал запросы Windows Management Interface (WMI), а не ctypes для вызова Windows API.
Или вы можете использовать эту функцию, написанную кем-то на PL / Perlu, чтобы сделать это с помощью df и синтаксический анализ вывода команды mount , который, вероятно, будет работать только в Linux, но, эй, это заранее написано.
Версия C для тех, кому нужен инструмент для проверки свободного места на сервере postgresql. Только для Linux и FreeBSD в настоящее время необходимо добавить правильные заголовки и определения для других ОС.
Вот реализация plpython2u, которую мы использовали некоторое время.
Использование это что-то вроде:
Здесь есть простой способ получить свободное место на диске без использования расширенного языка, просто определите функцию с помощью pgsql.
Использование df $PGDATA | tail -n +2 вместо df | tail -n +2 при сохранении всех данных по одному и тому же пути на диске. В этом случае функция возвращает использование диска только одной строкой для пути $ PGDATA.
ПРИМЕЧАНИЕ ПО БЕЗОПАСНОСТИ
ПРОГРАММА может запускать любую команду из оболочки, это как палка о двух концах. лучше всего использовать фиксированную командную строку или, по крайней мере, избегать передачи в нее любого пользовательского ввода. См. подробные сведения о документе.
Функция возвращает общий размер в байтах указанного раздела диска или каталога.
User Contributed Notes 9 notes
Transformation is possible WITHOUT using loops:
$bytes = disk_free_space ( "." );
$si_prefix = array( 'B' , 'KB' , 'MB' , 'GB' , 'TB' , 'EB' , 'ZB' , 'YB' );
$base = 1024 ;
$class = min ((int) log ( $bytes , $base ) , count ( $si_prefix ) - 1 );
echo $bytes . '
' ;
echo sprintf ( '%1.2f' , $bytes / pow ( $base , $class )) . ' ' . $si_prefix [ $class ] . '
' ;
?>
$si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );
you are missing the petabyte after terabyte
should look like
'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'
Nice, but please be aware of the prefixes.
SI specifies a lower case 'k' as 1'000 prefix.
It doesn't make sense to use an upper case 'K' as binary prefix,
while the decimal Mega (M and following) prefixes in SI are uppercase.
Furthermore, there are REAL binary prefixes since a few years.
Do it the (newest and recommended) "IEC" way:
KB's are calculated decimal; power of 10 (1000 bytes each)
KiB's are calculated binary; power of 2 (1024 bytes each).
The same goes for MB, MiB and so on.
Another easy way to convert bytes to human readable sizes would be this:
function HumanSize ( $Bytes )
$Type =array( "" , "kilo" , "mega" , "giga" , "tera" , "peta" , "exa" , "zetta" , "yotta" );
$Index = 0 ;
while( $Bytes >= 1024 )
$Bytes /= 1024 ;
$Index ++;
>
return( "" . $Bytes . " " . $Type [ $Index ]. "bytes" );
>
?>
It simply takes the $Bytes and divides it by 1024 bytes untill it's no longer over or equal to 1024, meanwhile it increases the $Index to allocate which suffix belongs to the return (adding 'bytes' to the end to save some space).
You can easily modify it so it's shorter, but I made it so it's more clearer.
This is not documented yet.
If $directory is invalid, then disk_free_space() will return false and ALSO throw a Warning: "disk_free_space(): No such file or directory"
With respect to Linux filesystems, I'll point out that this function returns the space available in the current volume or mountpoint, not the total physical disk space. That is, this function used on the '/root' volume shows the free space in /root, which is different from '/home', and so on.
On Windows, this also works with distant files, by using their full network path.
For instance, this will give the % of free disk space on the share "dir" from remote host "server" :
$path = "\\\\server\\dir" ;
echo( floor ( 100 * disk_free_space ( $disk ) / disk_total_space ( $disk )));
?>
It can also work with drive letters mapped to a network path in certain cases.
function size ( $size , array $options = null )
$o = [
'binary' => false ,
'decimalPlaces' => 2 ,
'decimalSeparator' => '.' ,
'thausandsSeparator' => '' ,
'maxThreshold' => false , // or thresholds key
'sufix' => [
'thresholds' => [ '' , 'K' , 'M' , 'G' , 'T' , 'P' , 'E' , 'Z' , 'Y' ],
'decimal' => ' B' ,
'binary' => ' iB'
]
];
if ( $options !== null )
$o = array_replace_recursive ( $o , $options );
$count = count ( $o [ 'sufix' ][ 'thresholds' ]);
$pow = $o [ 'binary' ] ? 1024 : 1000 ;
if (( $size < pow ( $pow , $i + 1 )) ||
( $i === $o [ 'maxThreshold' ]) ||
( $i === ( $count - 1 ))
)
return
number_format (
$size / pow ( $pow , $i ),
$o [ 'decimalPlaces' ],
$o [ 'decimalSeparator' ],
$o [ 'thausandsSeparator' ]
) .
str_replace (
'' ,
$o [ 'sufix' ][ 'thresholds' ][ $i ],
$o [ 'sufix' ][ $o [ 'binary' ] ? 'binary' : 'decimal' ]
);
>
var_dump ( size ( disk_free_space ( '/' )));
// string(8) "14.63 GB"
var_dump ( size ( disk_free_space ( '/' ), [ 'binary' => true ]));
// string(9) "13.63 GiB"
var_dump ( size ( disk_free_space ( '/' ), [ 'maxThreshold' => 2 ]));
// string(11) "14631.90 MB"
var_dump ( size ( disk_free_space ( '/' ), [ 'binary' => true , 'maxThreshold' => 2 ]));
// string(12) "13954.07 MiB"
Может возникать ситуация, когда сайт занимает много места на хостинге без видимых причин. Существуют графические утилиты, визуально отображающие занятое пространство, но использовать их на дальнем сервере не всегда представляется возможным.
Для этого есть системная утилита unix du . Выводит размер папки или всех подпапок.
Набросал небольшой скрипт, который через удаленную командную строку (ssh) визуально отображает занятое пространство в текущей папке. Используются только системные утилиты unix с тем чтобы он работал на большинстве хостингов.
[spoiler]
N.B. Внизу поста скрипт на php!
Если есть ssh доступ
Скачиваем zip архив , записываем на сайт. Далее подключаемся по ssh (для этого есть замечательная программа PuTTy ).
Перед запуском скрипта надо сделать его исполняемым:
Затем переходим в ту папку, размер которой нужно посчитать и запускаем скрипт, отобразится примерно следующее:
Разными цветами обозначаются разные уровни вложенности.
Размер текущей папки взят за 100%, показаны все папки и файлы внутри текущей, размер которых превышает 10%. Можно установить свой минимум. Например, если надо отобразить все файлы и папки, размером более 5% от текущей:
После первого запуска в папке /tmp создается файл с результатами сканирования размеров. Затем он используется для отображения. Если размеры изменились, используйте параметр -f чтобы принудительно пересчитать размеры:
Можно одновременно пересчитать размеры и отобразить файлы/папки более указанного значения:
Скрипт ничего не удаляет, может быть использован на любой linux системе со стандартным набором служебных утилит: du, egrep, awk, cat, tac.
Дополнение от 06.11.2014
Можно сразу скачать скрипт на удаленный сервер через короткую ссылку:
Как узнать размер базы данных
Открываем страницу резервного копирования, переходим на вкладку Расширенные , там рядом с опцией "Архивировать базу данных" показан размер базы:
Тут же отображается размер данных статистики и поисковой индекс.
Если надо получить подробную информацию по таблицам, в настройках модуля "Монитор производительности" включаем опцию "Просмотр таблиц". Теперь можно перейти на страницу Настройки - Производительность - Таблицы и увидеть отдельно размер каждой таблицы.
P.S. Скрипт изначально делал для себя, решил поделиться. Вот теперь думаю: может для большинства удобнее было бы иметь скрипт на php чтобы работал через браузер?
Дополнение от 05.09.2011
Подсчет размеров файлов через браузер
Восполнил пробел и сделал аналогичный по функциональности скрипт mydisk.php , подсчитывающий размер файлов в текущей папке через браузер. Работает по шагам (т.е. ограничение на время выполнение скриптов не хостинге не будет мешать), результат сохраняет во временный файл.
С визуализацией не стал заморачиваться, фактически переписал код на php. Самым сложным оказалось - правильно сохранить промежуточный результат сканирования между шагами.
В панели хостинга на главной странице в пункте «Ограничения» строка «Диск» — показывает сколько места занято на Вашем диске . Если доступного места на диске достаточно, то цвет текста будет зеленый, если место на диске скоро закончится, то цвет текста будет желтый, если место на диске закончилось — цвет текста красный.
Также справа в пункте «Использование диска» Вы можете увидеть диаграмму, которая показывает, чем именно занят Ваш диск: сайты, почта, базы данных и др.
Список параметров
Директория или раздел диска.
Замечание:
Если вместо директории будет передано имя файла, то поведение данной функции неизвестно и может отличаться на разных операционных системах и версиях PHP.
Примеры
// $df содержит общий размер диска "/" в байтах
$ds = disk_total_space ( "/" );
// В Windows:
$ds = disk_total_space ( "C:" );
$ds = disk_total_space ( "D:" );
?>
Что будет, если закончится место на диске?
Если на Вашей услуге хостинга закончится свободное место на диске, то Ваш сайт может некорректно работать, например, — в WordPress при авторизации в админ-панели создаются временные файлы. Соответственно, если диск будет заполнен, то временные файлы не смогут создаться и Вы не сможете авторизоваться в админ-панели.
Вам нужно будет произвести очистку диска или перейти на более высокий тариф для увеличения размера диска.
Также на нашем хостинге, мы отправляем уведомления пользователям по почте, когда место на диске начинает заканчиваться, чтобы Вы могли заранее принять меры и Ваши сайты работали без перебоев.
Смотрите также
- disk_free_space() - Возвращает размер доступного пространства в каталоге или файловой системе
Возвращаемые значения
Возвращает общий размер в байтах в виде числа с плавающей точкой или false в случае возникновения ошибки.
Читайте также: