Если база данных выдаёт ошибки при каждом обращении, а загружаемые файлы оказываются пустыми, то скорее всего закончилось место на хостинге (сервере). К сожалению, не существует способа проверки заполненности диска через 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(‘ ‘, ‘ ’, $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>