Место на хостинге

Если база данных выдаёт ошибки при каждом обращении, а загружаемые файлы оказываются пустыми, то скорее всего закончилось место на хостинге (сервере). К сожалению, не существует способа проверки заполненности диска через php, поэтому приходится извращаться через cron и команду df.

Часто хочется иметь перед глазами данные о заполненности дискового пространства хостинга/сервера, чтобы лимит места не оказался неожиданностью. Для этого использую непростую схему мониторинга. Смысл заключается в запуске команды df на сервере через cron и сохранении результатов в файл, доступный через php или js.

Команда df

Чтобы узнать свободное пространство на сервере (на Linux) необходимо ввести команду:

df -h

Ключ -h делает человеко-понятное представление данных, конвертируя байты в гигабайтыи т.п. Результат выполнения команды в консоли выглядит примерно так:

Узнать место на хостинге

Теперь этот результат надо сохранить в доступную для чтения папку сайта. Сделать это можно командой «>» которая направит весь вывод в нужный файл:

df -h > /полный_путь_к_файлу/df.txt

Файл будет называться df.txt. А чтобы данные в нём были актуальными, поставим эту команду выполняться на cron, на каждый день. Открываем файл /etc/crontab и добавляем в самый конец:

0 0 * * * root df -h > /полный_путь_к_файлу/df.txt

Не забудьте в конце файла поставить пустую строку перед сохранением.

Как прочитать файл с данными через PHP

Половина дела сделана — данные о размере и заполненности диска будут сохранятся в доступное для сайта место. Можно будет показать их в административном разделе сайта. Загрузка файла в php будет выглядеть так:

<div style=»font-family: monospace;»>

<?$df = ‘/путь_к_файлу_на_сайте/df.txt’;

if (file_exists($df)) {

$data = file_get_contents($df);

$data = str_replace(‘ ‘, ‘&nbsp;’, $data);

$data = nl2br($data);

echo $data;

} else {

echo «Файла данных о заполненности диска нет»;

}?>

</div>

Функции str_replace и nl2br нужны чтобы сделать красивый вывод, как в консоли. Иначе двойной пробел в html воспринимается как одинарный, а переносом строки служит «n» вместо <br>.

Ещё для полного совпадения стиля вывода с консольным необходимо задать моноширинный шрифт для div блока, куда будут выводится данные. С этой задачей справляется стиль font-family: monospace.

Но можно обрамить результат в тег <pre></pre>. Вывод будет примерно такой:

Filesystem         Size  Used Avail Use% Mounted on

/dev/ploop40523p1   25G  9.7G   14G  42% /

none               126G  4.0K  126G   1% /dev

none               126G     0  126G   0% /dev/shm

Как улучшить результат

Полученная метрика совпадает по стилю оформления с консольным выводом df -h, но содержит много ненужной информации. Хорошо бы сделать чтение только необходимых данных. По сути, нужна только одна цифра % из второй строки: «42%». Строчки получения и обработки результата регулярным выражением будут выглядеть так:

$data = file_get_contents($df);

preg_match(«/[0-9]{2}%/», $data, $res);

echo $res[0];

И вывод будет «42%». Это число можно обработать и далее. К примеру, если оно выше 90, то выводить предупреждение в административном разделе сайта.

Вывод

Надеюсь, этот способ получения свободного места на хостинге/сервере будет полезен. Использую его на всех своих серверах для мониторинга состояния. Чтобы не быть голословным, вот файл статистики этого сервера:



- вывод этих значений происходит через такой js код:

<pre id="js_df"></pre>

<script>

var client = new XMLHttpRequest();

client.open('GET', '/include/df', true);

client.onreadystatechange = function() {

document.getElementById('js_df').innerText = client.responseText;

}

client.send(null);

</script>



2017-04-01T19:54:48
Интернет